【问题标题】:Convert Joda-Time to Timestamp in UTC zone将 Joda-Time 转换为 UTC 区域中的时间戳
【发布时间】:2013-10-22 18:38:31
【问题描述】:

以下代码段使用 Joda-Time API 格式化并将日期转换为 UTC 时区。

DateTimeFormatter dateTimeFormatter=DateTimeFormat.forPattern("dd-MMM-yyyy hh:mm:ss aa");
DateTime dateTime = dateTimeFormatter.parseDateTime("15-Oct-2013 11:34:26 AM").withZone(DateTimeZone.UTC);        
System.out.println(dateTime);

它完全按照预期显示以下日期。

2013-10-15T06:04:26.000Z

但是当这个日期像这样转换为java.sql.Timestamp时,

System.out.println(new Timestamp(dateTime.getMillis()));

它显示以下日期。

2013-10-15 11:34:26.0

这意味着与给定的日期/时间相同。时区 UTC 似乎被忽略了。


如何让Timestamp 正确地将日期转换为UTC?

【问题讨论】:

  • 这并不是TimeStamp 忽略了时区,我相信它的toString 方法是使用本地时区 - 需要验证。请记住,TimeStampDate 之类的东西并不是用来显示结果的,这就是格式化程序的用途......
  • 有没有办法告诉Timestamp 使用UTC 时区? converter 中需要它。我最初认为这个转换器有问题。
  • AFAIK TimeStamp 只是一个自纪元以来毫秒数的容器,它不携带任何时区详细信息

标签: java timezone timestamp jodatime utc


【解决方案1】:

Java Timestamp.toString() 以 UTC 格式输出(尽管在 javadoc 中并没有说太多,但源代码没有使用 TimeZone 信息)。由于您的原始日期/时间是 UTC,您将看到完全相同的输出。

【讨论】:

    【解决方案2】:

    尽管println() 方法隐式使用Timestamp#toString() 方法,同时在控制台上显示它,而控制台又使用当前JVM 时区来显示日期时间(JVM 时区默认为系统时区,操作系统使用),问题的初衷是将new Timestamp(dateTime.getMillis())持久化到MySQL数据库UTC区域,由于以下相关答案中提到的原因,这不会发生。

    【讨论】:

      猜你喜欢
      • 2020-06-24
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      • 2013-08-18
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多