强制从java.time中的`DateTimeFormatter.ofLocalized ...`生成的本地化字符串中的4位数年份 [英] Force 4-digit-year in localized strings generated from `DateTimeFormatter.ofLocalized…` in java.time

查看:674
本文介绍了强制从java.time中的`DateTimeFormatter.ofLocalized ...`生成的本地化字符串中的4位数年份的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

java.time中的DateTimeFormatter 类提供了三个 ofLocalized ... 方法,用于生成表示包含一年的值的字符串。例如, ofLocalizedDate

The DateTimeFormatter class in java.time offers three ofLocalized… methods for generating strings to represent values that include a year. For example, ofLocalizedDate.

Locale l = Locale.US ; 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT ).withLocale( l );
LocalDate today = LocalDate.now( ZoneId.of( "America/Chicago" ) );
String output = today.format( f );

对于我看过的语言环境,年份只有两位数字 FormatStyle 样式。

For the locales I have seen, the year is only two digits in the shorter FormatStyle styles.

如何让java.time本地化强制年份为四位数而不是两年?

How to let java.time localize yet force the years to be four digits rather than two?

我怀疑答案在于 DateTimeFormatterBuilder 类。但我找不到任何改变一年的长度的功能。我也仔细阅读了 Java 9源代码,但不能很好地解释该代码以找到答案。

I suspect the Answer lies in DateTimeFormatterBuilder class. But I cannot find any feature alter the length of year. I also perused the Java 9 source code, but cannot spelunk that code well enough to find an answer.

此问题类似于:

  • forcing 4 digits year in java's simpledateformat
  • Jodatime: how to print 4-digit year?

...但这些问题针对的是现在由java.time类取代的旧日期时间框架。

…but those Questions are aimed at older date-time frameworks now supplanted by the java.time classes.

推荐答案

没有内置的方法可以满足您的需求。但是,您可以应用以下解决方法:

There is no built-in method for what you want. However, you could apply following workaround:

Locale locale = Locale.ENGLISH;
String shortPattern =
    DateTimeFormatterBuilder.getLocalizedDateTimePattern(
        FormatStyle.SHORT,
        null,
        IsoChronology.INSTANCE,
        locale
    );
System.out.println(shortPattern); // M/d/yy
if (shortPattern.contains("yy") && !shortPattern.contains("yyy")) {
    shortPattern = shortPattern.replace("yy", "yyyy");
}
System.out.println(shortPattern); // M/d/yyyy

DateTimeFormatter shortStyleFormatter = DateTimeFormatter.ofPattern(shortPattern, locale);
LocalDate today = LocalDate.now(ZoneId.of("America/Chicago"));
String output = today.format(shortStyleFormatter);
System.out.println(output); // 11/29/2016

这篇关于强制从java.time中的`DateTimeFormatter.ofLocalized ...`生成的本地化字符串中的4位数年份的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆