Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.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 DateTime在转换为日期时显示不同的日期_Java_Datetime_Jodatime - Fatal编程技术网

Java DateTime在转换为日期时显示不同的日期

Java DateTime在转换为日期时显示不同的日期,java,datetime,jodatime,Java,Datetime,Jodatime,我目前正在使用Java JODATIME DateTime。使用toDate()转换为日期时,我的日期时间为2015-09-08T11:00:00.000Z 我得到的日期对象为2015年9月8日星期二06:00:00 CDT DateTime dateTime = 2015-09-08T11:00:00.000Z; // Not a string I am getting this date from another API. Date date = dateTime.toDate(); //

我目前正在使用Java JODATIME DateTime。使用toDate()转换为日期时,我的日期时间为2015-09-08T11:00:00.000Z

我得到的日期对象为2015年9月8日星期二06:00:00 CDT

DateTime dateTime =  2015-09-08T11:00:00.000Z; // Not a string I am getting this date from another API.
Date date = dateTime.toDate(); //Tue Sep 08 06:00:00 CDT 2015.

我可以知道这里发生了什么吗?

一个
Date
对象只保存自1970年1月1日UTC以来的毫秒数。它不包含表示逻辑,因此您的注释(相当于早上6点CDT)表明某个东西(您的IDE或某个日期格式化程序)应用了时区,以便将日期呈现为人类可读的形式。代码实际上工作正常。

显然,您正在java.util.Date对象上调用
toString
方法。该类实现的
toString
具有一个令人困惑的特性,即在生成字符串表示时将JVM的当前默认时区静默地应用于日期时间值

java.util.Date对象本身没有时区,并且始终使用UTC

这是避免使用这些旧的java.util.Date/.Calendar类的许多合理方法之一。使用,现在内置到Java8和更高版本中。对于旧版本的Java,请使用

此外,在StackOverflow上,这个主题已经讨论过很多次了。请在邮寄前搜索

java.time中的一小段示例代码。
即时
是时间线上的一个瞬间。您的输入字符串恰好是java.time在解析/生成字符串时默认使用的标准格式。因此,您可以直接解析,而无需费心指定解析模式

String input = "2015-09-08T11:00:00.000Z";
Instant instant = Instant.parse( input );
Instant
调整到特定时区,以获得
ZonedDateTime

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
在StackOverflow.com上搜索更多java.time示例



实际上,java.util.Date的源代码中隐藏了一个时区,但出于实际目的被忽略了

看起来像是时区的问题!实际上没有问题。CDT是
-0500
,您的日期时间位于
0000
时区。因此,存在
5小时
Date的差异。toString()
始终使用系统本地时区。
Date
对象不包含任何格式状态,但该类在
toString
中包含最少的表示逻辑。(顺便说一句,我已经确定了大纪年——我想那只是一个打字错误。)你说得很对——这是一个打字错误。是的,toString有简单的格式,但本质上是
Date
对象包含UTC时间,可以格式化为用户需要的任何时区。