当前位置: 首页 > 知识库问答 >
问题:

在Java中如何使用Clock类从当前日期减去2个月

宋耀
2023-03-14

我正在编写代码,我需要使用Clock类来获取当前时间。我想用2个月减去当前日期。

这是代码:

public class DemoApp {
    private Clock clock = Clock.systemDefaultZone();

    public List<String> subtractMonths(String[][] str) {
        List<String> ids = new ArrayList<>();
        // The code
        return ids;
    }
}

在main类中,我有这个字符串数组:

private static final String[][] str = {
    {"id1", "2017-11-01T14:10:30"},
    {"id2", "2018-01-20T18:01:34"},
    {"id3", "2018-01-22T08:45:22"},
    {"id4", "2018-02-18T12:42:37"},
    {"id5", "2019-03-16T03:56:32"},
};

在main类中,我将使用str参数调用subtractMonths方法,如果日期不是当前月份和前一个月,则返回id。例如,如果当前月份为1月,则返回id为12月之前的月份。任何反馈都将不胜感激!

共有3个答案

虞滨海
2023-03-14

我认为这样的事情是有意的:

public List<String> subtractMonths(String[][] str) {
    YearMonth lastMonth = YearMonth.now(clock).minusMonths(1);
    List<String> ids = Arrays.stream(str)
            .filter(pair -> YearMonth.parse(pair[1], DateTimeFormatter.ISO_LOCAL_DATE_TIME)
                    .isBefore(lastMonth))
            .map(pair -> pair[0])
            .collect(Collectors.toList());
    return ids;
}

当我今天调用这个方法并将您的str作为参数传递时,我会得到这个结果:

[id1,id2,id3,id4]

是的,除了给定的Clock实例之外,我还使用YearMonthDateTimeFormatter类。但是,YearMonth从时钟获取时间。这反过来又保证了他们在要求你使用时钟时的行为。它们可以替代另一个时钟,代码将专门使用该时钟来确定我们所处的月份。

这对于可测试性来说非常好,也是一个经常使用的技巧。当你替换一个总是告诉你现在是2019年1月的时钟时,你就知道会出现什么样的结果。然后,你可以在2025年重新运行自动测试,并且仍然期望得到相同的结果。如果你没有得到,就报告失败,如果你得到了,就晚上睡个好觉。

链接:使用Java8个日期/时间类编写和测试方便方法

轩辕庆
2023-03-14

我认为这不可能是简单的方法。时钟中对时钟日期执行加减运算的唯一方法是

static Clock offset(Clock baseClock, Duration offsetDuration)

持续时间没有月,因为持续时间与位置和时间时刻无关。

然而,一个月的长度完全取决于此(在二月添加一个月比在一月添加一个月要短。同样,在闰年或夏令时添加一个月会有所不同)。

目前还没有简单的方法将一个月添加到特定日期。这是dart 2.0核心库的重大变化之一。

同时,最安全的方法是使用传入的所有参数构建一个新的DateTime,但在月份中添加1:new DateTime(other.year,other.month 1,other.day,other.hour,…)。

尽管如此,你仍然需要注意:在3月31日的基础上增加一个月意味着什么?使用上面的简单方法,你将在5月1日结束。如果这不是你想要的,你就得把这几个月的时间压缩。这需要更多的代码(包括知道什么时候有闰年)。

参考链接:https://github.com/flutter/flutter/issues/12141

田柏
2023-03-14

使用LocalDateTimeInstant可以使用减号()加号()来减去或增加时间量:

LocalDateTime beforeTwoMonths = LocalDateTime.now()
        .minus(2, ChronoUnit.MONTHS);

或者使用minusMonths()方法:

LocalDateTime beforeTwoMonths = LocalDateTime.now().minusMonths(2);

只使用时钟类是不可能的。唯一的方法是将其转换为ZonedDateTime并减去月份:

ZonedDateTime beforeTwoMonths = Clock.systemDefaultZone().instant().atZone(ZoneId.systemDefault()).minusMonths(2);

否则你可以自己计算,但我不认为这是最好的方法。

 类似资料:
  • 问题内容: 我想从Java中的当前日期减去n天。 我怎么做? 问题答案: 您不必使用日历。您可以只使用时间戳记: 更新 不要忘记在1000年底之前长时间添加“ l”。 请考虑以下警告: 在java秒,夏令时等情况下,将毫秒添加到Java日期中将使原始日期增加零天或两天。如果您需要100%确定仅添加一天,则此解决方案不可用。

  • 问题内容: 有人可以告诉我如何从当前日期减去45天吗? 谢谢 问题答案: 您可以使用Calendar类:

  • 本文向大家介绍使用Java中的Calendar.DATE从当前日期减去天数,包括了使用Java中的Calendar.DATE从当前日期减去天数的使用技巧和注意事项,需要的朋友参考一下 为Java中的Calendar类导入以下软件包。 首先,创建一个Calendar对象并显示当前日期。 现在,让我们使用方法和Calendar.DATE常数减去天数。由于我们在递减,因此请在此处设置一个负值。 示例 输

  • 问题内容: 我的心脏必须深入到减去两个日期以计算出天数后,内部开始流血: .NET或你命名的任何现代语言中只有两行代码。 这对Java不好吗?还是我应该知道一个隐藏的方法? 可以在util中使用Date类而不使用GregorianCalendar吗?如果是这样,我是否应该提防像1970年这样的细微事情? 谢谢 问题答案: 这确实是标准Java API中最大的史诗失败之一。有一点耐心,那么你将获得J

  • 我可以打印当前日期如何使用date对象从当前日期减去2天。无论之前在这个网站上问了什么问题,都不符合我的要求。如果我使用日历,那么我会得到不同格式的日期。我只希望使用date对象以yyyyMMdd格式显示日期。我尝试了这个方法,但我遇到了错误,就像运算符一样——参数类型字符串int未定义。请帮助我解决这个问题。