【问题标题】:How can I print a stored date using locales?如何使用语言环境打印存储的日期?
【发布时间】:2018-03-03 17:08:15
【问题描述】:

我需要以特定的语言环境格式 (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()));

【问题讨论】:

  • 您需要先将documentDate解析为Date,使用合适的模式,然后格式化获取的Date。请忘记 Calendar、SimpleDateFormat 和 Date。使用 LocalDate 和 DateTimeFormat,它们都是 Java 8 中引入的 java.time API 的一部分。如果卡在以前的 Java 版本中,则使用 Joda-time 或三个 backport 等效项。
  • 您需要知道(并指定)文档日期的格式:dd/MM/yyyy 或 MM/dd/yyyy。
  • 您的研究发现了什么?哪方面不够?当然,如何处理像 03/03/2018 这样的日期字符串已经在许多帖子中讨论过了。
  • @Ninja2k 我的评论是这样说的:请忘记日历、SimpleDateFormat 和日期。使用 LocalDate 和 DateTimeFormat。所以(即使 Date 没有被弃用),我建议你不要使用它,而是使用 LocalDate 。
  • 如何解析日期字符串(这是您缺少的部分):Java string to date conversion。如何使用本地化格式化:例如SimpleDateFormat and locale based format string。还有很多其他的。

标签: java date locale date-formatting date-parsing


【解决方案1】:
    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 2018 年 3 月 3 日

将日期格式从一个字符串更改为另一个是一个两步过程,通常需要两个格式化程序:您使用一个格式化程序将原始字符串解析为日期时间对象(此处为 LocalDate),然后使用第二个格式化程序用于格式化为所需格式的格式化程序。

针对特定语言环境的推荐格式化方法是通过内置的特定于语言环境的格式。这就是DateTimeFormatter.ofLocalizedDatewithLocale 的组合所提供的。

如果您的爱尔兰用户坚持,您当然可以像在问题中那样自己指定格式:

    String pattern = "EEEE MMMM yyyy";
    DateTimeFormatter formatIreland = DateTimeFormatter.ofPattern(pattern, localeIreland);

通过此更改,我的计算机上的输出为

Dé Sathairn Marta 2018

(在我看来,如果没有月份,它看起来有点滑稽,但你可以按照自己的方式拥有它。)

我正在使用并强烈推荐 java.time,它是现代 Java 日期和时间 API。您使用的日期时间类SimpleDateFormatCalendar 早已过时,尤其是前者非常麻烦。现代课程更易于使用。 LocalDate 似乎完全符合您的要求,因为它是一个没有时间的日期。

链接:Oracle tutorial: Date Time解释如何使用java.time

【讨论】:

  • 天啊,我简直不敢相信他们做这件事有多难,只是为了打印出日期。我花了 4 个小时浏览多个教程和 API,一些使用 Date,另一些使用 Calendar,没有一个完全符合我的需要,而且我什至还没有开始使用我的包,这是一场噩梦。谢谢!当我完成我的程序的其余部分时,我会接受这个并研究新的东西。
  • 如果您可以将文档日期存储为 LocalDate 对象(或从您的数据库中获取;JDBC 或 JPA 很乐意为您转换)或至少采用 ISO 8601 格式 (2018-03-03),因为 LocalDate 解析此格式时没有明确的格式化程序。
  • @Ninja2k 是的,像DateCalendar 这样的传统日期时间类是一团糟,非常糟糕。 java.time 类则相反:简洁、优雅的设计源自对日期时间处理所涉及的棘手问题的深刻理解。但是你确实需要花一些时间和学习来理解核心思想。
  • 我想看看你对localeIreland的定义。
  • @BasilBourque 我不知道 OP 使用了什么,也不认为它对演示很重要。我使用了Locale.forLanguageTag("ga-IE")。感谢您在回答中提出的建议。
【解决方案2】:

accepted Answer by Ole V.V. 是正确的。

仔细阅读所有本地化格式

如果您想细读所有已知时区的所有本地化格式,这里有一些代码可以将示例值转储到控制台。

使用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 ) 

[全、长、中、短]

收集您想尝试的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

…

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    相关资源
    最近更新 更多