gpt4 book ai didi

java - android - SimpleDateFormat 以奇怪的方式解析数据。错误的月份或/和年份

转载 作者:太空宇宙 更新时间:2023-11-03 12:28:55 26 4
gpt4 key购买 nike

我有以下代码 fragment :

final Date d = format.parse(value);
LOGGER.debug("Compare:\nOriginal: {}, Format: {}, Result: {}", value, format.toPattern(), d);
return d;

value 是来自 json 的字符串值,

format 是一个 java.text.SimpleDateFormat,

d 是从 value

解析的日期

有时它工作正常,但有时它返回奇怪的日期。

来自 logcat 的示例:

D/App: 20:14:47.309 com.example.backend.BackendHelper - Compare:     Original: 2016-09-16 13:45:00.000+0200, Format: yyyy-MM-dd HH:mm:ss.SSSZ, Result: Fri Jan 01 05:00:00 GMT+07:00 2016D/App: 20:14:47.309 com.example.backend.BackendHelper - Compare:     Original: 2016-09-16 13:20:00.000+0200, Format: yyyy-MM-dd HH:mm:ss.SSSZ, Result: Fri Jan 01 18:20:00 GMT+07:00 2016D/App: 20:14:47.338 com.example.backend.BackendHelper - Compare:     Original: 2016-09-16 15:20:00.000+0200, Format: yyyy-MM-dd HH:mm:ss.SSSZ, Result: Thu Jan 01 05:00:00 GMT+07:00 1970

如您所见,它为字符串值返回不正确的日期(错误的年份或/和月份或/和小时),这些字符串值具有完全相同的格式并且彼此仅在小时和分钟上有所不同。

问题是:为什么

最佳答案

您的格式模式是正确的。语言环境在这里不相关。

好吧,您还提供了问题中的输入,以便我们调查是否有任何不可打印的字符。没有(并且 JSON 不会产生这样的废话 - 非常不可能)。

因此,对观察到的不可预测行为的解释是缺乏线程安全。 SimpleDateFormat不幸的是,它不是线程安全的(并且还有许多其他缺点)。所以只存储 SimpleDateFormat 的一个实例因为静态类字段确实很危险。

如何规避 SimpleDateFormat 的限制?

  • 同步对 parse() 方法的调用(导致性能下降)
  • 存储SimpleDateFormat -对象变成ThreadLocal (更好)
  • 使用FastDateFormat (性能与ThreadLocale-solution相当,前缀“Fast”现在有点过时了)
  • 使用ThreetenABP -library(围绕新时间库包 java.time 并入 Java-8 的向后移植的 Android 改编),提供了一个不可变的解析器,例如:OffsetDateTime.parse(input, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSZ"))
  • 使用Joda-Time-Android (比 ThreetenABP 解析更快,也是不可变的),示例:DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSSZ").parseDateTime(input)
  • 或者试试我的图书馆 Time4A (恕我直言,最快的解决方案,也是不可变的),例如:ChronoFormatter.ofMomentPattern("yyyy-MM-dd HH:mm:ss.SSSZ", PatternType.CLDR, Locale.ROOT, ZonalOffset.UTC).parse(input)

选择一个不可变的格式化程序/解析器无疑是进入多线程环境的最佳和最现代的方式。对于 Android,库 Apache Commons 和 ThreetenABP 比更快的替代品 Joda-Time 或 Time4A 更紧凑。您必须自己评估对您来说更重要的因素,无论是尺寸还是性能(或者您可能需要的其他功能)。

关于java - android - SimpleDateFormat 以奇怪的方式解析数据。错误的月份或/和年份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39535078/

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