我想以独立于语言环境的方式打印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
结合起来。
答案 0 :(得分:3)
您可以使用private_key_file
和java.time.format.DateTimeFormatterBuilder
的重复字段:
Y
pattern)w
pattern)代码是:
WeekFields.ISO
而不是创建新的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
输出结果为:
一周的第一天:星期一 第1周的最短天数:4
1998至1953年
即使我更改了格式化程序的语言环境:
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));
或者:
formatter = formatter.withLocale(Locale.GERMANY);
输出保持不变。