【问题标题】:Getting the millis since EPOCH of an UTC date returning wrong results? [duplicate]获取自 UTC 日期的 EPOCH 以来返回错误结果的毫秒? [复制]
【发布时间】:2016-12-26 14:39:51
【问题描述】:

我知道 Java 中的 Date.getTime() 将返回自 EPOCH 以来的毫秒,将日期视为 UTC 日期。

在 Java 6 上,我有一个日期,如果我在该日期上执行 Date.getTime(),它会返回自 EPOCH 以来的毫秒,考虑到日期位于 PDT 时区。 (我运行代码的服务器是在PDT时间配置的。)

我希望程序将其视为 UTC 日期并返回自 EPOCH 以来的毫秒数。

以下是我的代码 sn-p 和输出:

 logger.debug("Date: " + someDate);
 logger.debug("someDate in millis): " + someDate.getTime());

 Output:                                                                                                         
 Date: 2016-08-19 12:04:56.993
 someDate in millis: 1471633496993 //This is time since EPOCH for 2016-08-19 12:04:56.993 PDT

而我希望它将毫秒返回为 1471608296993(1471608296993 是自 UTC 的 EPOCH 以来的毫秒日期:2016-08-19 12:04:56.993)

简而言之,我想获得自 EPOCH 以来的毫秒,而不考虑本地时区,在我的情况下是 PDT。

请帮忙。

【问题讨论】:

  • 你能在你创建someDate的地方添加代码吗?
  • 我从 SQL Server 数据库中获得了“someDate”
  • 数据库是否返回带有时区信息的日期?
  • 没有。它不是完全像上面那样显示的。

标签: java utc epoch


【解决方案1】:

根据 Java 文档 getTime()

返回自 1970 年 1 月 1 日 00:00:00 以来的毫秒数 格林威治标准时间

不使用当地时区

【讨论】:

  • 是的,这就是我到处读到的。但是,如果您看到我得到的输出,似乎并非如此。
  • 似乎有问题的 Date 对象正在使用提供的 String 并将其视为 OP 默认时区中的时间,并在幕后将其转换为 UTC 时间。 12:04 PDT 与 12:04 UTC 不同,实际上是 19:04 UTC,因此预期输出与实际输出存在差异。
  • 使用生成的毫秒并在此处验证epochconverter.com
  • 这就是我得到 19:04 的地方。这个问题是有效的。 Date 对象将字符串视为 PDT,而不是 UTC
【解决方案2】:

除了约翰霍普金斯已经说过的话。

Date 对象将时间存储在 milliseconds since January 1, 1970, 00:00:00 GMT 中。但是当您打印出来时,它将打印为您当前时区的日期。

下面的sn-p演示一下。

Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("UTC"));
cal.set(Calendar.YEAR, 2016);
cal.set(Calendar.MONTH, Calendar.AUGUST);
cal.set(Calendar.DAY_OF_MONTH, 19);
cal.set(Calendar.HOUR_OF_DAY, 12);
cal.set(Calendar.MINUTE, 4);
cal.set(Calendar.SECOND, 56);
cal.set(Calendar.MILLISECOND, 993);

long epochMillis = cal.getTime().getTime();
System.out.println("EPOCH millis    = " + epochMillis);
System.out.println("date from cal   = " + cal.getTime());
Date date = new Date(epochMillis);
System.out.println("date from epoch = " + date);

输出

EPOCH millis    = 1471608296993
date from cal   = Fri Aug 19 14:04:56 CEST 2016
date from epoch = Fri Aug 19 14:04:56 CEST 2016

date from ... 的两行使用您的默认时区打印日期 2016-08-19 12:04:56.993 UTC

【讨论】:

    【解决方案3】:

    使用从this answerthis question 的信息,我能够想出正确地将您的String 解析为UTC 日期时间的代码。诀窍是在创建Date 对象之前使用SimpleDateFormat 对象来解析String

    String strDate = "2016-08-19 12:04:56.993";
    SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    isoFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
    Date date = isoFormat.parse(strDate);
    System.out.println(date);
    System.out.println(date.getTime());
    

    输出:

    Fri Aug 19 08:04:56 EDT 2016
    1471608296993
    

    【讨论】:

    • 谢谢乔霍普金斯。这有助于解决问题。在发布问题之前,我已经尝试过上述解决方案,但我想我更多地关注显示为输出的日期格式,我没有意识到毫秒是正确的。但这有助于我理解 System.out.println 中显示的日期使用本地时区来显示结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 2015-10-17
    • 2012-05-03
    • 2013-07-28
    • 2021-04-02
    • 1970-01-01
    相关资源
    最近更新 更多