【问题标题】:Joda-Time parse datetime in different languageJoda-Time 以不同的语言解析日期时间
【发布时间】:2015-02-22 06:21:03
【问题描述】:

我正在尝试使用以下类似代码解析Joda-Time 的时间(从Using Joda Date & Time API to parse multiple formats 中的btiernay 复制)

DateTimeParser[] parsers = { 
        DateTimeFormat.forPattern( "yyyy-MM-dd HH" ).getParser(),
        DateTimeFormat.forPattern( "yyyy-MM-dd" ).getParser() };
DateTimeFormatter formatter = new DateTimeFormatterBuilder().append( null, parser).toFormatter();

DateTime date1 = formatter.parseDateTime( "2010-01-01" );
DateTime date2 = formatter.parseDateTime( "2010-01-01 01" );

但是,该应用程序可能在海外使用,这意味着月份可能包含外语,

例如 Haz 在土耳其语中是六月的缩写,我如何让它解析“07.Haz.2014”,它会抛出 java.lang.IllegalArgumentException: Invalid format

【问题讨论】:

  • 您是否尝试过使用土耳其语DateTimeZone
  • 首先,您需要一个接受月份names 以及月份numbers 的模式。其次,您可能必须为解析器提供一个语言环境(我不知道 Joda 的时间)。
  • @ElliottFrisch 不,不是时区。需要的是java.util.Locale,其语言将用于解析月份名称。时区根据当地时间调整,但与语言无关。

标签: java parsing datetime formatter


【解决方案1】:

格式必须与您的输入相匹配

您的输入数据07.Haz.2014 与示例代码yyyy-MM-dd HH 中的格式不匹配。

有关正确的格式模式,请参阅下面的示例代码。

指定区域设置

要解析Turkish months 的名称,您必须指定Java locale(其中包括一种语言)。看到这个问题,Setting Turkish and English locale

Joda-Time 2.3 中的示例代码。

Locale 对象由语言和国家/地区组成。

注意时区的使用。如果您省略时区,则会为您分配一个,即 JVM 当前的默认时区。最好指定一个而不是依赖于默认值。时区控制如何解释一天的开始。 6 月 7 日在世界各地的不同时刻开始,例如,伊斯坦布尔的新一天比蒙特利尔更早。

不要混淆区域设置和时区。

  • 区域设置 = 语言 + 文化
    • 语言环境控制语言,用于在解析/生成文本时选择月份、星期几等名称。
    • 区域设置的国家/地区部分将时间调整到该区域。相反,国家/地区定义了在生成日期时间的文本表示时应用的文化规则。例如,是否应该将星期几放在前面。
  • 时区 = 偏移 + 异常

通常我们将语言环境和时区放在一起,在语言环境的地理中使用时区,但实际上它们可以是正交的。例如,蒙特利尔的一位商人可能希望在法语中读取日期时间字符串,该字符串表示土耳其客户期望交货时的本地日期时间。在这种情况下,字符串会使用 Québécois 区域设置但土耳其时区呈现。

我强烈建议始终指定语言环境和时区。如果省略,则应用 JVM 的默认值之一/两者。这种默认值的应用不会导致日期时间编程中的混乱。

String input = "07.Haz.2014";

java.util.Locale locale = new java.util.Locale( "tr", "TR" );
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Istanbul" );  // Assuming this time zone (not specified in Question).
DateTimeFormatter formatter = DateTimeFormat.forPattern( "dd.MMM.yyyy" ).withLocale( locale ).withZone( timeZone );
DateTime dateTime = formatter.parseDateTime( input );
String outputQuébécois = DateTimeFormat.forStyle( "FF" ).withLocale( java.util.Locale.CANADA_FRENCH ).print( dateTime ); // 
DateTime dateTimeUtc = dateTime.withZone( DateTimeZone.UTC );

转储到控制台…

System.out.println( "input: " + input );
System.out.println( "locale: " + locale );
System.out.println( "dateTime: " + dateTime );
System.out.println( "outputQuébécois: " + outputQuébécois );
System.out.println( "dateTimeUtc: " + dateTimeUtc );

运行时……

input: 07.Haz.2014
locale: tr_TR
dateTime: 2014-06-07T00:00:00.000+03:00
outputQuébécois: samedi 7 juin 2014 0 h 00 EEST
dateTimeUtc: 2014-06-06T21:00:00.000Z

【讨论】:

    猜你喜欢
    • 2014-04-08
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    相关资源
    最近更新 更多