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

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

但是我可以在不指定绑定(bind)到特定国家/地区的任何语言环境的情况下这样做吗?我找到了 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);

输出保持不变。

关于java - 独立于区域设置的年周日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45880644/

相关文章:

c# - sqlite 抛出一个 "String not recognized as a valid datetime"

javascript - 如何在 javascript 中获取上一小时、上个月和昨天?

java - 使用 CDI : Service stays null 时休息服务将无法工作

java - GUI 元素的处理

python - 将 RFC 3339 时间转换为标准 Python 时间戳

.net - DateTime.Now.ToShortDateString();替换月和日

java - 将 CRC8 从 C 转换为 Java

java - jersey 2.2 和 Spring Security 3 依赖关系?

sql - TSQL SELECT先前日期的记录

python将任何日期时间字符串转换为UTC