独立于区域设置的年周日期格式

Locale independent year week date format

我想以独立于区域设置的方式打印 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 结合起来。

您可以使用 java.time.format.DateTimeFormatterBuilderWeekFields.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 代替:

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);

输出保持不变。