获取自 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
。
我明白 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
。