关于java:从UTC日期EPOCH返回错误结果后得到毫无疑问?

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

本问题已经有最佳答案,请猛点这里访问。

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

在Java 6上,我有一个Date,如果我执行Date.getTime(),它将返回自EPOCH以来的millis,考虑到Date在PDT时区。 (运行代码的服务器在PDT时间内配置。)

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

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

1
2
3
4
5
6
 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

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

总之,我想从EPOCH获得毫无疑问,无论当地时区,在我的情况下是PDT。

请帮忙。


根据Java Doc getTime()

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

它不使用本地时区


除了johnhopkins已经说过的内容之外。

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

以下代码段演示了它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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);

产量

1
2
3
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


使用此问题的答案中的信息,我能够提出将String正确解析为UTC日期时间的代码。 诀窍是在创建Date对象之前使用SimpleDateFormat对象解析String

1
2
3
4
5
6
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());

输出:

1
2
Fri Aug 19 08:04:56 EDT 2016
1471608296993