我想以独立于区域设置的方式打印 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);
但是我可以在不指定绑定(bind)到特定国家/地区的任何语言环境的情况下这样做吗?我找到了 java.time.temporal.WeekFields#ISO
:
public static final WeekFields ISO = new WeekFields(DayOfWeek.MONDAY, 4);
这是我想要的,但我不知道如何将它与 DateTimeFormatter
结合使用。
最佳答案
您可以使用 java.time.format.DateTimeFormatterBuilder
和 WeekFields.ISO
的相应字段:
- week-based-year(即 equivalent of
Y
pattern ) - week-of-week-based-year(即 equivalent of
w
pattern)
代码是:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
// append week year
.appendValue(WeekFields.ISO.weekBasedYear(), 4)
// separator
.appendLiteral('-')
// append week of week year field
.appendValue(WeekFields.ISO.weekOfWeekBasedYear(), 2)
// create formatter
.toFormatter().withZone(ZoneOffset.UTC);
不用创建新的 WeekFields
实例(使用 WeekFields.of(locale)
),只需使用 WeekFields.ISO
即可:
System.out.format("First day of week : %s%n", WeekFields.ISO.getFirstDayOfWeek());
System.out.format("Min days in 1st week : %s%n", WeekFields.ISO.getMinimalDaysInFirstWeek());
Instant instant = Instant.parse("1998-12-31T00:00:00Z");
System.out.println(formatter.format(instant));
输出是:
First day of week : MONDAY
Min days in 1st week : 4
1998-53
即使我更改格式化程序的语言环境:
formatter = formatter.withLocale(Locale.GERMANY);
或者:
formatter = formatter.withLocale(Locale.ENGLISH);
输出保持不变。
关于java - 独立于区域设置的年周日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45880644/