Java DateTime在转换为日期时显示不同的日期
我目前正在使用Java JODATIME DateTime。使用toDate()转换为日期时,我的日期时间为2015-09-08T11:00:00.000Z 我得到的日期对象为2015年9月8日星期二06:00:00 CDTJava 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(); //
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时间,可以格式化为用户需要的任何时区。