我们的项目需要季度支持,但不幸的是我们使用的是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

最佳答案

关于时区问题:

timezone data/rules of ICU4J和您的Java-7-JVM在1234年可能有所不同。通常您应该使用1900年以后的年份,对吧?如果是这样,那么获得相同规则的可能性就更高。如果没有,那么您应该真正在乎选择正确的版本以确保您具有相同的规则。也许您还需要应用Oracle的tzupdater-tool


  有关区域的更新:
  
  得益于OP的深入研究,我们可以设置system property specific for ICU4Jcom.ibm.icu.util.TimeZone.DefaultTimeZoneType = JDK


无论如何,如果使用ICU4J的唯一原因是对季度的支持,那么也可以选择

要么

使用我的库Time4J(在Java-6 + 7上可运行的v3.x-line)。它还通过较小的尺寸和更好的API(接近Java-8中的java.time)提供季度支持,包括基于与ICU4J相同的CLDR数据的良好国际化,另请参见pattern doc

要么

使用Threeten-Backport(不利于不进行任何国际化->缺少本地化数据)。

10-06 16:20