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,因此偏移量为零)。这会将您的数据转换为日期明确的格式。
我从我的请求中获取动态日期,
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,因此偏移量为零)。这会将您的数据转换为日期明确的格式。