如何使用语言环境打印存储的日期?
How can I print a stored date using locales?
我需要以特定的语言环境格式 (localeIreland) 打印存储的日期 (documentDate),到目前为止我只能使用 cal.getDate() 打印今天的日期是否可以将日历设置为使用存储的日期值打印?
String documentDate = "03/03/2018";
String pattern = "EEEEE MMMMM yyyy";
SimpleDateFormat formatIreland= new SimpleDateFormat(pattern, localeIreland);
Calendar cal = Calendar.getInstance();
System.out.println(formatIreland.format(documentDate));
这只会打印出今天的日期。
System.out.println(formatIreland.format(cal.getDate()));
DateTimeFormatter docDateFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu");
String documentDate = "03/03/2018";
DateTimeFormatter formatIreland = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL)
.withLocale(localeIreland);
System.out.println(LocalDate.parse(documentDate, docDateFormatter).format(formatIreland));
在我的电脑上刚刚打印出来
Dé Sathairn 3 Márta 2018
将日期格式从一个字符串更改为另一个字符串是一个 two-step 过程,通常需要两个格式化程序:您使用一个格式化程序将原始字符串解析为 date-time 对象(此处为 LocalDate
) 然后是第二个格式化程序,用于格式化为所需的格式。
针对特定语言环境的推荐格式化方式是通过 built-in locale-specific 格式。这就是 DateTimeFormatter.ofLocalizedDate
和 withLocale
的组合。
如果您的爱尔兰用户坚持,您当然可以像问题中那样自己指定格式:
String pattern = "EEEE MMMM yyyy";
DateTimeFormatter formatIreland = DateTimeFormatter.ofPattern(pattern, localeIreland);
通过此更改,我计算机上的输出为
Dé Sathairn Márta 2018
(对我来说,没有日期看起来有点滑稽,但你可以随心所欲。)
我正在使用并热烈推荐 java.time,现代 Java 日期和时间 API。您使用的 date-time 类、SimpleDateFormat
和 Calendar
早已过时,尤其是前者是出了名的麻烦。现代的 类 更好用。 LocalDate
似乎完全符合您的要求,因为它是一个没有 time-of-day.
的日期
Link: Oracle tutorial: Date Time 解释如何使用 java.time
.
是正确的。
仔细阅读所有本地化格式
如果您想细读所有已知时区的所有本地化格式,这里有一些代码可以将示例值转储到控制台。
使用DateTimeFormatter
自动本地化。要本地化,请指定:
FormatStyle
确定字符串的长度或缩写。
Locale
确定 (a) 用于翻译日期名称、月份名称等的人类语言,以及 (b) 决定缩写、大写、标点符号、分隔符等问题的文化规范,等等。
示例:
Locale locale = Locale.CANADA_FRENCH ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( locale );
String output = localDate.format( f );
指定所有格式样式。
EnumSet.allOf( FormatStyle.class )
[FULL, LONG, MEDIUM, SHORT]
收集你想尝试的Locale
件物品。您可以获得所有已知语言环境的列表。
Locale[] locales = Locale.getAvailableLocales();
或者只指定几个语言环境。
List < Locale > locales = new ArrayList <>( 3 );
locales.add( Locale.CANADA_FRENCH ); // French, Québec Canada
locales.add( new Locale( "ga" , "IE" ) ); // Irish, Ireland
locales.add( new Locale( "en" , "IE" ) ); // English, Ireland
locales.add( Locale.US ); // English, United States
完整的示例代码。
LocalDate ld = LocalDate.of( 2018 , Month.MARCH , 23 );
List < Locale > locales = new ArrayList <>( 3 );
locales.add( Locale.CANADA_FRENCH );
locales.add( new Locale( "ga" , "IE" ) );
locales.add( new Locale( "en" , "IE" ) );
locales.add( Locale.US );
for ( Locale locale : locales )
{
System.out.println( "------| LOCALE: " + locale + " — " + locale.getDisplayName() + " |----------------------------------" + System.lineSeparator() );
for ( FormatStyle style : EnumSet.allOf( FormatStyle.class ) )
{
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( style ).withLocale( locale );
String output = ld.format( f );
System.out.println( output );
}
System.out.println( "" );
}
System.out.println( "« fin »" + System.lineSeparator() );
我们少数语言环境的输出。
------| LOCALE: fr_CA — French (Canada) |----------------------------------
vendredi 23 mars 2018
23 mars 2018
23 mars 2018
18-03-23
------| LOCALE: ga_IE — Irish (Ireland) |----------------------------------
Dé hAoine 23 Márta 2018
23 Márta 2018
23 Márta 2018
23/03/2018
------| LOCALE: en_IE — English (Ireland) |----------------------------------
Friday 23 March 2018
23 March 2018
23 Mar 2018
23/03/2018
------| LOCALE: en_US — English (United States) |----------------------------------
Friday, March 23, 2018
March 23, 2018
Mar 23, 2018
3/23/18
« fin »
所有 736 个语言环境中前 8 个的输出(在 Java 9.0.4 中)。 (文本中约 120K 的全部内容对于 Stack Overflow 来说太多了。)
------| LOCALE: — |----------------------------------
2018 Mar 23, Fri
2018 Mar 23
2018 Mar 23
2018-03-23
------| LOCALE: nn — Norwegian Nynorsk |----------------------------------
fredag 23. mars 2018
23. mars 2018
23. mars 2018
23.03.2018
------| LOCALE: ar_JO — Arabic (Jordan) |----------------------------------
الجمعة، 23 آذار، 2018
23 آذار، 2018
23/03/2018
23/3/2018
------| LOCALE: bg — Bulgarian |----------------------------------
петък, 23 март 2018 г.
23 март 2018 г.
23.03.2018 г.
23.03.18 г.
------| LOCALE: kea — Kabuverdianu |----------------------------------
sesta-fera, 23 di Marsu di 2018
23 di Marsu di 2018
23 Mar 2018
23/3/2018
------| LOCALE: zu — Zulu |----------------------------------
ULwesihlanu, Mashi 23, 2018
Mashi 23, 2018
Mas 23, 2018
3/23/18
------| LOCALE: am_ET — Amharic (Ethiopia) |----------------------------------
ዓርብ ፣23 ማርች 2018
23 ማርች 2018
23 ማርች 2018
23/03/2018
------| LOCALE: fr_DZ — French (Algeria) |----------------------------------
vendredi 23 mars 2018
23 mars 2018
23 mars 2018
23/03/2018
…
我需要以特定的语言环境格式 (localeIreland) 打印存储的日期 (documentDate),到目前为止我只能使用 cal.getDate() 打印今天的日期是否可以将日历设置为使用存储的日期值打印?
String documentDate = "03/03/2018";
String pattern = "EEEEE MMMMM yyyy";
SimpleDateFormat formatIreland= new SimpleDateFormat(pattern, localeIreland);
Calendar cal = Calendar.getInstance();
System.out.println(formatIreland.format(documentDate));
这只会打印出今天的日期。
System.out.println(formatIreland.format(cal.getDate()));
DateTimeFormatter docDateFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu");
String documentDate = "03/03/2018";
DateTimeFormatter formatIreland = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL)
.withLocale(localeIreland);
System.out.println(LocalDate.parse(documentDate, docDateFormatter).format(formatIreland));
在我的电脑上刚刚打印出来
Dé Sathairn 3 Márta 2018
将日期格式从一个字符串更改为另一个字符串是一个 two-step 过程,通常需要两个格式化程序:您使用一个格式化程序将原始字符串解析为 date-time 对象(此处为 LocalDate
) 然后是第二个格式化程序,用于格式化为所需的格式。
针对特定语言环境的推荐格式化方式是通过 built-in locale-specific 格式。这就是 DateTimeFormatter.ofLocalizedDate
和 withLocale
的组合。
如果您的爱尔兰用户坚持,您当然可以像问题中那样自己指定格式:
String pattern = "EEEE MMMM yyyy";
DateTimeFormatter formatIreland = DateTimeFormatter.ofPattern(pattern, localeIreland);
通过此更改,我计算机上的输出为
Dé Sathairn Márta 2018
(对我来说,没有日期看起来有点滑稽,但你可以随心所欲。)
我正在使用并热烈推荐 java.time,现代 Java 日期和时间 API。您使用的 date-time 类、SimpleDateFormat
和 Calendar
早已过时,尤其是前者是出了名的麻烦。现代的 类 更好用。 LocalDate
似乎完全符合您的要求,因为它是一个没有 time-of-day.
Link: Oracle tutorial: Date Time 解释如何使用 java.time
.
仔细阅读所有本地化格式
如果您想细读所有已知时区的所有本地化格式,这里有一些代码可以将示例值转储到控制台。
使用DateTimeFormatter
自动本地化。要本地化,请指定:
FormatStyle
确定字符串的长度或缩写。Locale
确定 (a) 用于翻译日期名称、月份名称等的人类语言,以及 (b) 决定缩写、大写、标点符号、分隔符等问题的文化规范,等等。
示例:
Locale locale = Locale.CANADA_FRENCH ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( locale );
String output = localDate.format( f );
指定所有格式样式。
EnumSet.allOf( FormatStyle.class )
[FULL, LONG, MEDIUM, SHORT]
收集你想尝试的Locale
件物品。您可以获得所有已知语言环境的列表。
Locale[] locales = Locale.getAvailableLocales();
或者只指定几个语言环境。
List < Locale > locales = new ArrayList <>( 3 );
locales.add( Locale.CANADA_FRENCH ); // French, Québec Canada
locales.add( new Locale( "ga" , "IE" ) ); // Irish, Ireland
locales.add( new Locale( "en" , "IE" ) ); // English, Ireland
locales.add( Locale.US ); // English, United States
完整的示例代码。
LocalDate ld = LocalDate.of( 2018 , Month.MARCH , 23 );
List < Locale > locales = new ArrayList <>( 3 );
locales.add( Locale.CANADA_FRENCH );
locales.add( new Locale( "ga" , "IE" ) );
locales.add( new Locale( "en" , "IE" ) );
locales.add( Locale.US );
for ( Locale locale : locales )
{
System.out.println( "------| LOCALE: " + locale + " — " + locale.getDisplayName() + " |----------------------------------" + System.lineSeparator() );
for ( FormatStyle style : EnumSet.allOf( FormatStyle.class ) )
{
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( style ).withLocale( locale );
String output = ld.format( f );
System.out.println( output );
}
System.out.println( "" );
}
System.out.println( "« fin »" + System.lineSeparator() );
我们少数语言环境的输出。
------| LOCALE: fr_CA — French (Canada) |----------------------------------
vendredi 23 mars 2018
23 mars 2018
23 mars 2018
18-03-23
------| LOCALE: ga_IE — Irish (Ireland) |----------------------------------
Dé hAoine 23 Márta 2018
23 Márta 2018
23 Márta 2018
23/03/2018
------| LOCALE: en_IE — English (Ireland) |----------------------------------
Friday 23 March 2018
23 March 2018
23 Mar 2018
23/03/2018
------| LOCALE: en_US — English (United States) |----------------------------------
Friday, March 23, 2018
March 23, 2018
Mar 23, 2018
3/23/18
« fin »
所有 736 个语言环境中前 8 个的输出(在 Java 9.0.4 中)。 (文本中约 120K 的全部内容对于 Stack Overflow 来说太多了。)
------| LOCALE: — |----------------------------------
2018 Mar 23, Fri
2018 Mar 23
2018 Mar 23
2018-03-23
------| LOCALE: nn — Norwegian Nynorsk |----------------------------------
fredag 23. mars 2018
23. mars 2018
23. mars 2018
23.03.2018
------| LOCALE: ar_JO — Arabic (Jordan) |----------------------------------
الجمعة، 23 آذار، 2018
23 آذار، 2018
23/03/2018
23/3/2018
------| LOCALE: bg — Bulgarian |----------------------------------
петък, 23 март 2018 г.
23 март 2018 г.
23.03.2018 г.
23.03.18 г.
------| LOCALE: kea — Kabuverdianu |----------------------------------
sesta-fera, 23 di Marsu di 2018
23 di Marsu di 2018
23 Mar 2018
23/3/2018
------| LOCALE: zu — Zulu |----------------------------------
ULwesihlanu, Mashi 23, 2018
Mashi 23, 2018
Mas 23, 2018
3/23/18
------| LOCALE: am_ET — Amharic (Ethiopia) |----------------------------------
ዓርብ ፣23 ማርች 2018
23 ማርች 2018
23 ማርች 2018
23/03/2018
------| LOCALE: fr_DZ — French (Algeria) |----------------------------------
vendredi 23 mars 2018
23 mars 2018
23 mars 2018
23/03/2018
…