Joda-Time用不同语言解析日期时间

时间:2014-06-12 14:28:12

标签: java parsing datetime formatter

我正在尝试使用下面的类似代码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" );

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

例如6月土耳其语的Haz会缩短,如何解析“07.Haz.2014”,它会抛出java.lang.IllegalArgumentException:格式无效

1 个答案:

答案 0 :(得分:11)

格式必须与您的输入匹配

您的输入数据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