【问题标题】:Local timezone date object to UTC timezone date object [duplicate]本地时区日期对象到 UTC 时区日期对象 [重复]
【发布时间】:2019-06-05 02:28:39
【问题描述】:

我正在尝试将本地时区的日期时间转换为 UTC 日期时间。

    Date localDate; // this is local date 

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ") ;
    simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
    String dateStr = simpleDateFormat.format(localDate);

我在dateStr 中得到正确转换的 UTC 时间,现在我想将其转换为仅具有 UTC 时区的 Date 对象 但是当我这样做的那一刻,我又得到了localDate

    //converting string to date object

    simpleDateFormat.parse(dateStr)

有谁知道如何将本地日期对象转换为 UTC 日期对象

这是我在调试时得到的值

这里 dateStr 以 UTC 显示正确的日期,但 utcDate 对象显示的是当地时间

【问题讨论】:

  • 顺便考虑扔掉长期过时且臭名昭著的麻烦SimpleDateFormat和朋友,并将ThreeTenABP添加到您的Android项目中,以便使用java.time,现代Java日期和时间API .使用起来感觉好多了。
  • 你不能。 Date 没有时区。 (不,您的屏幕截图没有显示Date 的值,它显示了调用其toString 方法的结果。令人困惑的是Date 使用您的JVM 的时区来生成从toString 返回的字符串。 )

标签: java android date datetime utc


【解决方案1】:

Date 类旨在反映协调世界时 (UTC) 时间。它可以格式化为您想要的任何形式,例如您可以将其格式化为您当地的时区或 UTC 时区。

参见 javadoc:https://docs.oracle.com/javase/8/docs/api/java/util/Date.html

尽管 Date 类旨在反映协调世界时 (UTC),但它可能并不完全如此,这取决于 Java 虚拟机的主机环境。几乎所有现代操作系统都假定在所有情况下 1 天 = 24 × 60 × 60 = 86400 秒。然而,在 UTC 中,大约每隔一两年就会多出一秒,称为“闰秒”。闰秒总是作为一天的最后一秒添加,并且总是在 12 月 31 日或 6 月 30 日。例如,由于添加了闰秒,1995 年的最后一分钟是 61 秒。大多数计算机时钟不够准确,无法反映闰秒的区别。

【讨论】:

  • 嗯,这与我的问题有什么关系,因为当我存储日期时它会变成本地时间戳并将该时间传递给服务器,而不是我想传递 UTC
  • 它只是一个关于什么时区的格式。如果你想得到 UTC 的绝对毫秒数,你可以调用date.getTime(),这已经是 UTC 值了。
  • 对于客户端和服务器传输,最好传递毫秒而不是String格式。这是因为,毫秒是一个绝对值,可以根据您的要求转换为任何格式,字符串格式通常需要一个附加参数说明它是哪个时区,以便服务器端可以正确解释。
  • 在第三方服务器中,我们需要以yyyy-MM-dd'T'HH:mm:ssZZZZZ 格式传递日期,并且保存该时间的数据类型为Date 类型
  • 查看我的编辑,它显示了我在调试时得到的数据
猜你喜欢
  • 2015-12-10
  • 2016-12-15
  • 2013-09-15
  • 2020-10-25
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 2019-05-24
  • 1970-01-01
相关资源
最近更新 更多