ICU4j SimpleDateFormatter 返回奇怪的结果

ICU4j SimpleDateFormatter returning odd results

我们的项目需要季度支持,不幸的是我们在 java 1.7 上,并且由于不幸的其他原因而停滞不前。

我们添加了 ICU4j 库以使用其中提供的 SimpleDateFormat。

不幸的是,它非常奇怪地解析日期(见下文)。任何帮助,将不胜感激。

  val formatter  = new java.text.SimpleDateFormat("yyyy")
  val formatter2 = new com.ibm.icu.text.SimpleDateFormat("yyyy")
  Array(formatter2.parse("1234"), formatter.parse("1234"))

结果

0 = {Date@10561} "Sun Jan 01 00:00:00 PST 1234"
1 = {Date@10563} "Sun Jan 01 00:12:28 PST 1234"

我已经广泛阅读了文档,但不确定为什么要使用偏移量进行解析。我确信它是 api 的一部分,希望有人能解释我的困难。任何帮助,将不胜感激。

http://www.icu-project.org/apiref/icu4j/com/ibm/icu/text/SimpleDateFormat.html

关于时区问题:

可能是 Oracle 的 timezone data/rules of ICU4J and your Java-7-JVM are different for the year 1234. Normally you should use years after 1900, right? If so then the probability to get the same rules are much higher. If not then you should really care about choosing the right versions to ensure you have the same rules. Maybe you also need to apply the tzupdater-tool

Update about zones:

Thanks to the good research of OP, we can set a system property specific for ICU4J: com.ibm.icu.util.TimeZone.DefaultTimeZoneType = JDK

无论如何,如果使用 ICU4J 的唯一原因是 支持 quarter-years 那么替代方案也可能是

任一

使用我的图书馆Time4J (v3.x-line runnable on Java-6+7). It also offers quarter support by a lower size and better API (nearer to what java.time in Java-8 does) including good internationalization based on same CLDR-data as ICU4J does, see also pattern doc

使用 Threeten-Backport(缺点是没有任何国际化 -> 缺少本地化数据)。