使用Joda DateTimeFormatter.withLocale()只影响am / pm的字符串值,而不影响时间格式

时间:2017-10-04 19:12:57

标签: java locale jodatime date-formatting

明确使用withLocale将语言环境设置为德语会导致am / pm字符串在时间值中进行本地化,但不会转换为适合该语言环境的24小时时间格式。

创建新流程后,Locale.setLocale(Locale.GERMAN);已完成,格式正确。

withLocale()不应该影响相关语言区域的所有方面吗?

// Code snippet where call is being made:
Log.d(TAG, "XYZZY getDefault(): " + Locale.getDefault().toString());
DateTimeFormatter timeFormat = DateTimeFormat.shortTime()
          .withLocale(Locale.getDefault());
Log.d(TAG, "XYZZY timeFormat.locale: " +
           timeFormat.getLocale().toString());
dateString = alarmTime.toString(timeFormat);
Log.d(TAG, "XYZZY dateString: "+ dateString);

当变量alarmTime的值为晚上11点(2300小时)时:

  

10-04 14:17:41.492(23609):XYZZY getDefault():en_US
  10-04 14:17:41.493(23609):XYZZY timeFormat.locale:en_US
  10-04 14:17:41.495(23609):XYZZY dateString:11:00 PM

现在切换到德语区域设置并重新执行相同的代码,请注意 'PM'的字符串更改为德语,但不是时间格式(后缀 应该被抑制,时间值应该是23:00):

  

10-04 14:18:15.066(23609):XYZZY getDefault():de_DE
  10-04 14:18:15.066(23609):XYZZY timeFormat.locale:de_DE
  10-04 14:18:15.067(23609):XYZZY dateString:11:00 nachm。

等待进程消失并重新启动,将语言环境保留为 德语,现在返回德语的正确时间格式:

  

10-04 14:18:54.497(23881):XYZZY getDefault():de_DE
  10-04 14:18:54.497(23881):XYZZY timeFormat.locale:de_DE
  10-04 14:18:54.498(23881):XYZZY dateString:23:00

1 个答案:

答案 0 :(得分:0)

免责声明:不是答案,因为我无法复制,而是写作答案,以显示我如何尝试重现问题。

我使用JDK 1.8.0_91和 Joda-Time 2.9.9 在时区en_US中使用区域设置America/New_York运行。

测试

LocalTime time = LocalTime.parse("23:00");
System.out.println(time);
System.out.println(time.toString(DateTimeFormat.shortTime()));
System.out.println(time.toString(DateTimeFormat.shortTime().withLocale(Locale.GERMANY)));

输出

23:00:00.000
11:00 PM
23:00

shortTime()可以正常工作,无论是否更改区域设置。

JVM默认语言环境从未更改过。