获取自 UTC 日期的 EPOCH 以来返回错误结果的毫秒数?

Getting the millis since EPOCH of an UTC date returning wrong results?

我明白 Date.getTime() in Java 将 return 自 EPOCH 以来的毫秒数,将日期视为 UTC 日期。

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

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

以下是我的代码片段和输出:

 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

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

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

请帮忙。

根据 Java 文档 getTime()

Returns the number of milliseconds since January 1, 1970, 00:00:00 GMT

不使用本地时区

使用来自 this answer to 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

Johnhopkins 已经说过的内容的补充。

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

以下代码片段对此进行了演示。

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