gpt4 book ai didi

java - Joda-Time 以不同的语言解析日期时间

转载 作者:行者123 更新时间:2023-12-01 00:16:28 25 4
gpt4 key购买 nike

我正在尝试使用 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

最佳答案

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

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

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

指定区域设置

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

Joda-Time 中的示例代码2.3.

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

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

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

  • 地区 = 语言 + 文化
  • 语言环境控制用于在解析/生成文本时选择月份、星期几等名称的语言。
  • 区域设置的国家/地区部分不会将时间调整到该区域。相反,国家/地区定义了在生成日期时间的文本表示时应用的文化规则。例如,是否应将星期几放在前面。
  • 时区 = 偏移 + 异常
  • 时区调整为本地wall-clock time .时区表示提前或落后一些小时和分钟数UTC .此偏移量由 PLUS 或 MINUS 表示,小时数为两位数,可选两位数分钟。示例:-08:00北美西海岸比 UTC 晚几个小时,+05:30印度比世界标准时间早五个半小时。
  • 时区还包含过去、现在和计划中的异常,例如 historical corrections , political/bureaucratic adjustments , 和 Daylight Saving Time废话。

  • 通常我们将语言环境和时区放在一起考虑,在语言环境的地理中使用时区,但实际上它们可以是正交的。例如,蒙特利尔的一位商人可能希望在法语中读取日期时间字符串,该字符串表示土耳其客户期望交货时的本地日期时间。在这种情况下,字符串以 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

    关于java - Joda-Time 以不同的语言解析日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24186954/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com