【问题标题】:Date Time conversion in user timezone用户时区中的日期时间转换
【发布时间】:2014-01-17 08:46:58
【问题描述】:

我在 sqlite 数据库中有记录的特定日期字段,它以特定格式保存。

为了将此 date 列转换为某种格式,我进行了一些日期格式设置并将其添加到数组 dbDates 中,代码如下-

SimpleDateFormat dateIn = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");

dbDates.add(dateIn.format(formatter.parse("2013-12-16T02:00:00.000Z");
dbDates.add(dateIn.format(formatter.parse("2013-12-15T01:30:00.000Z");

控制台中打印的 dbDates 现在采用以下格式 -

Mon Dec 16 02:00:00 GMT+05:30 2013

Sun Dec 15 01:30:00 GMT+05:30 2013

注意:如前所述,+05:30 被添加到每个 dbDate 的末尾。

当我将其转换为用户时区时,这会导致问题。

所以添加这一行----

dateIn.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));  

将输出更改为 -

Sun Dec 15 12:30:00 PST 2013
Sun Dec 14 12:00:00 PST 2013

但是,正确的输出应该是:

Sun Dec 15 18:00:00 PST 2013

Sun Dec 14 17:30:00 PST 2013

因此,输出有 +05:30 的差异。如何解决?

【问题讨论】:

    标签: java android sqlite timezone simpledateformat


    【解决方案1】:

    与 Java 捆绑的 java.util.Date 类在实例内部没有定义时区。然而它的toString 方法使用JVM 的默认时区呈现一个字符串。我敢打赌,您的 JVM 设置为印度时区,时间为 +05:30。

    这是避免使用 java.util.Date/Calendar 类的众多原因之一。它们在设计和实现方面都是出了名的糟糕。

    立即为自己下载 Joda-Time 库的副本。将其用于所有业务逻辑和计算。

    在 Joda-Time 中,DateTime 实例确实知道自己的时区。

    当需要处理其他类时,通过在 DateTime 实例上调用 toDate 方法转换为 j.u.Date。

    在 StackOverflow.com 中搜索 joda 以查找许多示例。

    在 Java 8 中,要么继续使用 Joda-Time,要么切换到 JSR 310 定义的新 java.time.* 类。新类受到 Joda-Time 的启发,但完全重新架构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      • 2012-01-30
      • 1970-01-01
      • 2015-05-15
      相关资源
      最近更新 更多