获取自 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 以来返回错误结果的毫秒? [复制]的主要内容,如果未能解决你的问题,请参考以下文章