Java8 即时日期和时间 API

Java8 Date and Time with Instant API

我从我的请求中获取动态日期,

Instant duration = request.getStartDate();   // my input is 2020-03-01T00:00:01Z
for (int i = 0; i < 12; i++) {
  duration  = duration.with(TemporalAdjusters.firstDayOfNextMonth ());
}

基本上我想在 12 个月内获取每个月的第一天,我尝试使用上面的代码但出现异常,

java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: DayOfMonth

我的输出可能是,

2020-04-01T00:00:01Z
2020-05-01T00:00:01Z
2020-06-01T00:00:01Z
:
:
2021-03-01T00:00:01Z

这里有什么遗漏吗?尝试使用 plus()

duration.plus(30, ChronoUnit.DAYS);

我尝试将 instant 转换为 locateDate,然后打印正常,但对于我需要的格式,我需要从 localdate 转换为 Instant。我没有看到下个月的第一天。


2019-03-31T22:00:00Z
2019-04-30T22:00:00Z
2019-05-31T22:00:00Z
2019-06-30T22:00:00Z
2019-07-31T22:00:00Z
2019-08-31T22:00:00Z
2019-09-30T22:00:00Z
2019-10-31T23:00:00Z
2019-11-30T23:00:00Z
2019-12-31T23:00:00Z

如有任何建议,我们将不胜感激。谢谢!

Instant startInstant = request.getStartDate();
LocalDate start = startInstant.atZone(ZoneOffset.UTC).toLocalDate().withDayOfMonth(1);
for (int i = 0; i < 12; i++) {
    System.out.println(start.plusMonths(i).atStartOfDay().toInstant(ZoneOffset.UTC));
}

比我的同名答案简单得多:如果您预先转换为 OffsetDateTime,使用您最初尝试使用的漂亮的人类可读调节器就没有问题。

OffsetDateTime duration = Instant.now().atOffset(ZoneOffset.UTC);
for (int i = 0; i < 12; i++) {
    duration = duration.with(TemporalAdjusters.firstDayOfNextMonth());
}

问题是 Instant 是一个明确的时间点,与任何特定时区或地理位置无关。没有与瞬间相关的具体日期;一个地方的第一个星期一可能是另一个地方的第 31 个星期日,但它仍然是同一时刻。这就是为什么在尝试设置该月的第一天时出现异常的原因。

如果您转换为 OffsetDateTime,您将应用一个偏移量(在本例中为 UTC,因此偏移量为零)。这会将您的数据转换为日期明确的格式。