【发布时间】:2017-08-25 11:43:36
【问题描述】:
我想以独立于区域设置的方式打印Instant,ISO 设置为一周的第一天(星期一)和第一周的最少天数 (4)。
我目前的设置是:
private String print(Instant i) {
DateTimeFormatter formatter = DateTimeFormatter
.ofPattern("YYYY-ww")
.withZone(UTC);
return formatter.format(i);
}
@Test
public void test() {
System.out.format("First day of week : %s%n",
WeekFields.of(Locale.getDefault()).getFirstDayOfWeek());
System.out.format("Min days in 1st week : %s%n",
WeekFields.of(Locale.getDefault()).getMinimalDaysInFirstWeek());
Instant instant = Instant.parse("1998-12-31T00:00:00Z");
System.out.println(print(instant));
}
对于系统区域设置“en_US”,测试打印:
First day of week : SUNDAY
Min days in 1st week : 1
1999-01
对于系统区域设置“de_DE”,测试打印:
First day of week : MONDAY
Min days in 1st week : 4
1998-53
“de_DE”区域设置与 ISO 设置一致,我知道我可以将格式化程序设置为
DateTimeFormatter formatter = DateTimeFormatter
.ofPattern("YYYY-ww")
.withZone(UTC)
.withLocale(Locale.GERMANY);
但我可以在不指定绑定到特定国家/地区的任何语言环境的情况下这样做吗?我找到了java.time.temporal.WeekFields#ISO:
public static final WeekFields ISO = new WeekFields(DayOfWeek.MONDAY, 4);
这是我想要的,但我不知道如何将它与DateTimeFormatter结合起来。
【问题讨论】:
-
根据 DateTimeFormatter 的文档,“如果 [withZone] 被覆盖,则日期时间值将在格式化之前转换为具有请求的 ZoneId 的 ZonedDateTime。在解析期间,在返回值之前应用 ZoneId” .所以我认为会发生什么是解析创建一个美国当地时间,然后在格式化期间重新分区为 UTC。
-
@daniu 我最初的想法和你一样,但现在我认为它与 zoneId 无关。即使我创建了一个没有区域 (
DateTimeFormatter.ofPattern("YYYY-ww")) 的格式化程序并使用它来格式化LocalDate(没有时区信息),每个区域设置的输出也会发生变化。星期字段Y和w的行为似乎确实是特定于语言环境的,无论时区如何。
标签: java datetime datetime-format java-time