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

sha*_*bai 2 java datetime parsing formatter

我正在尝试使用类似的代码解析Joda-Time的时间(从使用Joda Date&Time API的 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" );
Run Code Online (Sandbox Code Playgroud)

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

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

Bas*_*que 11

格式必须与您的输入匹配

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

请参阅下面的示例代码以获取正确的格式模式

指定区域设置

要解析土耳其语月份的名称,必须指定Java语言环境(包括语言).请参阅此问题,设置土耳其语和英语区域设置.

Joda-Time 2.3中的示例代码.

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

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

不要混淆语言环境和时区.

  • 区域设置 =语言+文化
    • 语言环境控制用于选择月份名称,星期几等语言,以及解析/生成文本时使用的语言.
    • 区域设置的国家/地区部分不会调整到该区域的时间.相反,国家/地区定义了在生成日期时间的文本表示时应用的文化规则.例如,应该将星期几放在前面.  
  • 时区 =偏移+异常
    • 时区调整为当地挂钟时间.时区表示UTC之前或之后的一些小时和分钟.此偏移量由PLUS或MINUS表示,两位数小时,以及可选的两位数分钟.示例:-08:00北美西海岸比UTC晚几个小时,+05:30印度比UTC晚五个半小时.
    • 时区还包含过去,现在和计划的异常,例如历史更正,政治/官僚调整夏令时废话.

通常我们将区域设置和时区一起考虑,在区域设置的地理区域中使用时区,但实际上它们可以是正交的.例如,蒙特利尔的商人可能希望用法语读取日期时间字符串,该字符串表示土耳其客户期望交货时的本地日期时间.在这种情况下,字符串将使用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 );
Run Code Online (Sandbox Code Playgroud)

转储到控制台......

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 );
Run Code Online (Sandbox Code Playgroud)

跑的时候......

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
Run Code Online (Sandbox Code Playgroud)