代码之家  ›  专栏  ›  技术社区  ›  Adam Michalik

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

  •  3
  • Adam Michalik  · 技术社区  · 7 年前

    Instant

    我当前的设置是:

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

    First day of week      : SUNDAY
    Min days in 1st week   : 1
    1999-01
    

    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 回复  |  直到 7 年前
        1
  •  3
  •   user7605325 user7605325    7 年前

    你可以使用 java.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) ),只需使用 相反:

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


    第1周的最小天数:4
    1998-53


    formatter = formatter.withLocale(Locale.GERMANY);
    

    或:

    formatter = formatter.withLocale(Locale.ENGLISH);
    

    输出保持不变。