【问题标题】:New Date() object changes format when switching timezones切换时区时新的 Date() 对象改变格式
【发布时间】:2020-11-12 09:11:34
【问题描述】:

我正在使用一个应用程序,它每隔几秒就从一个位置对象创建一个新的Date() 对象:

val logDate = Date(location.time).toString()
Log.d("test", "$logDate")

每隔几秒,日期就会记录到控制台:

D/测试:2020 年 7 月 22 日星期三 12:02:14 MDT

D/测试:2020 年 7 月 22 日星期三 12:02:19 MDT

如果我随后进入设备上的日期和时间设置并手动将时区更改为布宜诺斯艾利斯,将开始打印以下内容:

D/测试:2020 年 7 月 22 日星期三 15:02:24 GMT-03:00

D/测试:2020 年 7 月 22 日星期三 15:02:35 GMT-03:00

请注意添加了“GMT-03:00”。由于格式的变化,这种格式的变化会导致应用程序更深层次的各种解析相关的异常。

问题:

  1. 为什么切换时区后格式会改变?
  2. 有没有办法确保只使用一种格式?

谢谢!

【问题讨论】:

  • 显式格式化字符串?我是 ISO8601 的粉丝,而且..
  • 改用日历
  • @user2864740 ISO8601 正在其他地方使用。这不是问题,并且与发布的问题无关,因为这些问题与通过Date() 构建日期以及默认情况下表示该日期的格式特别相关。有趣的是,在某些情况下,Date() 的字符串表示不被接受为其自己的构造函数Date(s: String) 的有效格式。
  • @Style-7 我很欣赏您的评论,但交换实现并不能解决问题。
  • 使用 SimpleDateFormat

标签: android date kotlin timezone


【解决方案1】:

问题在于“GMT-03:00”不是添加,而是“MDT”(山地日期时间)的替代品。您共享的两个输出中都指定了时区。

您可以按照Andreas 中的this answer 中的说明使用JodaTime 库来避开时区,或者使用enter link description here 回复的SimpleDateFormat。

【讨论】:

  • 问题是Date(s: String) 构造函数不接受它自己的格式(当使用“GMT-03:00”时)。所以在我的例子中,Date() 作为字符串吐出Wed Jul 22 15:02:24 GMT-03:00 2020,然后存储在数据库中。然后检索相同的字符串并用于重新创建Date 对象时,将该字符串传递给构造函数将导致解析错误。这看起来非常奇怪,而且我通常会报告为错误。这是 Date() 类的预期行为吗?如果有,为什么?
  • 输出可以使用 GMT 偏移量 - developer.android.com/reference/java/util/Date
  • @Orbit 您应该将Date 存储为Datelong 在数据库中。在 UI 中显示 Date 时将其解析为 String。用于实例化Date() 对象的唯一非弃用方法是public Date(long date)long 表示以毫秒为单位的时间,这是最精确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 2011-01-28
相关资源
最近更新 更多