Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取UTC日期返回错误结果的自纪元起的毫秒数?_Java_Utc_Epoch - Fatal编程技术网

Java 获取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

我知道Java中的Date.getTime()将返回自纪元起的毫秒,并将该日期视为UTC日期

在Java6上,我有一个日期,如果我在该日期执行Date.getTime(),它将返回自历元以来的毫秒数,因为该日期位于PDT时区。(我运行代码的服务器是在PDT时间内配置的。)

<> >我希望程序考虑一个UTC日期,并返回自从历元以来的毫秒。

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

 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中显示的日期使用本地时区显示结果。