区域设置独立年份日期格式

时间:2017-08-25 11:43:37

标签: java datetime datetime-format java-time

我想以独立于语言环境的方式打印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结合起来。

1 个答案:

答案 0 :(得分:3)

您可以使用private_key_filejava.time.format.DateTimeFormatterBuilder的重复字段:

代码是:

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

输出保持不变。