【问题标题】:Wrong timezone information with Java JodaTimeJava JodaTime 的时区信息错误
【发布时间】:2017-04-19 15:46:35
【问题描述】:

我正在后端生成一些 UTC 时间并使用 websockets 将其发送到我的 Android 应用程序。

问题是:当我显示日期时,它落后了 3 个小时,这是因为我假设我的手机处于 +3 时区。

以下是后端代码和 Android 代码的摘录。

后端代码(这就是我使用时刻库​​生成 UTC 日期的方式):

let d = moment.utc().toISOString();

在我的 Android 应用程序中,我是这样处理它的:

String sendDate = "2017-04-19T15:41:36.758Z"; //this is an example server response
DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
dtf.parseLocalDateTime(sendDate).toDate()

问题是 UTC 日期未正确显示/转换为手机当前所在的时区,因此日期总是落后 3 小时。

我错过了什么?

【问题讨论】:

  • 你检查过手机默认的TimeZoneDateTimeZone.getDefault()的结果)吗?
  • 你得到的输出和预期的输出是什么?
  • 试试dtf.parseLocalDateTime(sendDate).toDate(DateTimeZone.UTC) 因为我担心toDate() 不带参数会隐式使用系统时区(使用Joda-Time 的数据)。而您的LocalDateTime 显然是基于UTC 输入...
  • @MenoHochschild 只是一个小细节,LocalDateTime.toDate 方法将java.util.TimeZone 作为参数(根据javadoc,对于joda-time >= 2.3),所以调用将是dtf.parseLocalDateTime(sendDate).toDate(DateTimeZone.UTC.toTimeZone()) .但我不确定这是否是 OP 想要的
  • @Hugo 你是对的,我忽略了它,很惊讶 Joda-Time 真的在这个地方使用旧的 API。而且这两种方法也没有很好的记录。所以 OP 需要测试。

标签: android node.js date momentjs jodatime


【解决方案1】:

解决方案是为 toDate() 方法指定一个时区。

dtf.parseLocalDateTime(sendDate).toDate(DateTimeZone.UTC.toT‌​‌​imeZone())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-25
    • 2012-11-25
    • 2012-08-18
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    相关资源
    最近更新 更多