Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Joda Time用不同的语言解析datetime_Java_Parsing_Datetime_Formatter - Fatal编程技术网

Java Joda Time用不同的语言解析datetime

Java Joda Time用不同的语言解析datetime,java,parsing,datetime,formatter,Java,Parsing,Datetime,Formatter,我试图使用如下类似的代码来解析时间(复制自btiernay in) 但是,该应用程序可能在海外使用,这意味着该月可能包含外语 例如,Haz是土耳其语中六月的缩写,我如何让它解析“07.Haz.2014”,它抛出一个java.lang.IllegalArgumentException:无效格式格式必须与您的输入匹配 您的输入数据07.Haz.2014与示例代码yyyy-MM-dd-HH中的格式不匹配 有关正确的格式模式,请参见下面的示例代码 指定区域设置 要分析的名称,必须指定(包括语言)。看这个

我试图使用如下类似的代码来解析时间(复制自btiernay in)

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

例如,Haz是土耳其语中六月的缩写,我如何让它解析“07.Haz.2014”,它抛出一个java.lang.IllegalArgumentException:无效格式

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

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

指定区域设置 要分析的名称,必须指定(包括语言)。看这个问题

2.3中的示例代码

区域设置对象由语言和国家/地区组成

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

不要混淆地区和时区

  • 地区=语言+文化
    • 区域设置控制解析/生成文本时用于选择月份、星期几等名称的语言
    • 区域设置的国家/地区部分不会调整该区域的时间。相反,国家/地区定义了在生成日期时间的文本表示时应用的文化规则。例如,星期几应该放在前面吗。
  • 时区=偏移量+异常
    • 时区会根据本地时间进行调整。时区表示前进或后退的小时数和分钟数。该偏移量用两位数小时的加号或减号表示,也可以用两位数分钟表示。示例:
      -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 );
转储到控制台

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 );
当运行时

输入:07.Haz.2014
地点:tr_tr
日期时间:2014-06-07T00:00:00.000+03:00
产量:2014年700万美元
日期时间UTC:2014-06-06T21:00:00.000Z

您尝试过使用土耳其语吗?首先,您需要一种既接受月名又接受月号的模式。其次,您可能必须为解析器提供一个区域设置(我不太喜欢Joda计时)。@ElliottFrisch不,不是时区。我们需要的是一个,它的语言将用于解析月份名称。时区根据当地时间进行调整,但与语言无关。
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 );