获取自 UTC 日期的 EPOCH 以来返回错误结果的毫秒? [复制]

Posted

技术标签:

【中文标题】获取自 UTC 日期的 EPOCH 以来返回错误结果的毫秒? [复制]【英文标题】:Getting the millis since EPOCH of an UTC date returning wrong results? [duplicate] 【发布时间】: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” 数据库是否返回带有时区信息的日期? 没有。它不是完全像上面那样显示的。 可能相关:Is java.sql.Timestamp timezone specific? 【参考方案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 answer 到this 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 中显示的日期使用本地时区来显示结果。

以上是关于获取自 UTC 日期的 EPOCH 以来返回错误结果的毫秒? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

powershell 获取自Epoch以来的秒数

日期字符串到纪元秒 (UTC)

XQuery 中是不是有任何方法可以获取自某个 Epoch 以来的当前时间(以毫秒为单位)?

time模块

PostgreSQL中epoch的用法

如何从 gmtime() 的时间 + 日期输出中获取纪元以来的秒数?