Java 获取UTC日期返回错误结果的自纪元起的毫秒数?
我知道Java中的Date.getTime()将返回自纪元起的毫秒,并将该日期视为UTC日期 在Java6上,我有一个日期,如果我在该日期执行Date.getTime(),它将返回自历元以来的毫秒数,因为该日期位于PDT时区。(我运行代码的服务器是在PDT时间内配置的。) <> >我希望程序考虑一个UTC日期,并返回自从历元以来的毫秒。 以下是我的代码片段和输出:Java 获取UTC日期返回错误结果的自纪元起的毫秒数?,java,utc,epoch,Java,Utc,Epoch,我知道Java中的Date.getTime()将返回自纪元起的毫秒,并将该日期视为UTC日期 在Java6上,我有一个日期,如果我在该日期执行Date.getTime(),它将返回自历元以来的毫秒数,因为该日期位于PDT时区。(我运行代码的服务器是在PDT时间内配置的。) >我希望程序考虑一个UTC日期,并返回自从历元以来的毫秒。 以下是我的代码片段和输出: logger.debug("Date: " + someDate); logger.debug("someDate in milli
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日期:2016-08-19 12:04:56.993的自纪元起的毫秒)
简言之,我想得到自大纪元以来的毫,而不考虑本地时区,在我的例子中是PDT
请帮助。根据Java文档
getTime(
)
返回自1970年1月1日00:00:00以来的毫秒数
格林尼治标准时间
它不使用本地时区使用到中的信息,我能够找到将
字符串
正确解析为UTC日期时间的代码。诀窍是在创建Date
对象之前,使用SimpleDateFormat
对象解析字符串
:
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
除了约翰霍普金斯已经说过的话之外
Date
对象以毫秒为单位存储自1970年1月1日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
两行datefrom…
使用您的默认时区打印日期2016-08-19 12:04:56.993 UTC
。您可以在创建someDate
的位置添加代码吗?我从SQL server数据库获取“someDate”数据库是否返回带有时区信息的日期?否。它的显示方式与可能是相关的:是的,我到处都读过。但是,如果您看到我得到的输出,情况似乎并非如此。似乎讨论中的Date对象正在获取提供的字符串,并将其视为OP的默认时区中的时间,并在幕后将其转换为UTC时间。12:04 PDT与12:04 UTC不同,事实上它是19:04 UTC,因此预期输出与实际输出存在差异。使用生成的毫秒数,并在此处验证19:04的来源。这个问题是正确的。Date对象将字符串视为PDT,而不是UTCThank you jonhopkins。这有助于解决这个问题。在发布问题之前,我曾尝试过上述解决方案,但我想我更多地关注显示为输出的日期格式,我没有意识到毫秒是正确的。但这帮助我理解System.out.println中显示的日期使用本地时区显示结果。