java - ICU4j SimpleDateFormatter 返回奇怪的结果

标签 java scala simpledateformat icu icu4j

我们的项目需要季度支持,不幸的是我们使用的是 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 年之后的年份,对吗?如果是这样,那么获得相同规则的概率要高得多。如果没有,那么您应该真正关心选择正确的版本,以确保您拥有相同的规则。也许您还需要申请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 的唯一原因是支持季度,那么替代方案也可能是

或者

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

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

关于java - ICU4j SimpleDateFormatter 返回奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41886501/

相关文章:

java - 尝试替换以/x2D开头的字符串的一部分

scala - 如何在 Scala 测试中将模拟调用与通配符匹配?

scala - 无法找到参数 FromRequestUnmarshaller Akka 的隐式值

scala - 如何向 DataFrame 类型添加新方法?

java - 尝试解析日期字符串时出现 ParseException

java - 在android中更改静态字符串变量时更改textview

java - 快速排序和中值实现的堆栈溢出错误

java - 为什么以下正则表达式不适用于 Java?

java - 如何在 android 中将日期从 GMT TimeZone 解析为 IST TimeZone 反之亦然

java - 按照月份名称在前的格式获取日期