在我的国家,夏令时规则已更改,我们不再使用它。因此很多设备都遇到了问题。我使用了不同的方法来解决这个问题,但只有其中一种可以正常工作。
我正在尝试将纪元时间转换为当地时间。例如
val epocTime = 1715244851730 // 12:24:11.730 PM GMT+03:30
当我使用
SimpleDateFormat
时,我得到错误的结果。
java.text.SimpleDateFormat("HH:mm", Locale.getDefault(Locale.Category.FORMAT))
.format(Date(time)) // 13:24
当我使用
java.time.LocalDateTime
时,我得到错误的结果
java.time.LocalDateTime.ofInstant(
java.time.Instant.ofEpochMilli(epocTime),
java.time.ZoneId.systemDefault()
) // 13:24:11.730
但是当我使用
ThreeTen
库时,我得到了正确的结果
org.threeten.bp.LocalDateTime.ofInstant(
org.threeten.bp.Instant.ofEpochMilli(epocTime),
org.threeten.bp.ZoneId.systemDefault(),
) // 12:24:11.730
所以问题是:
java time
不是 ThreeTen
库的替代品吗?
类似于 更新 Android tzdata 文件 以及我对 Android - 如何修复 java.time.zone.ZoneRulesException: 未知时区
的回答因此,对于不再获得
tzdata
更新的旧设备,您需要使用joda-time-android,它似乎会以一定的频率更新tzdata,但请注意,如果您希望与当前 tzdata
集保持一致。 ThreeTenBackport 也存在类似的情况,您需要将库更新到最新版本才能获得 tzdata
更新。