为什么Joda DateTime给出的结果与Java日期不同?

问题描述 投票:0回答:2
i测试了使用UTC时区对

java.util.Dateimport org.joda.time.DateTime; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.Date; public class Main { public static void main(String[] args) throws ParseException { String dt = "2011-06-11T12:00:00Z"; String format = "yyyy-MM-dd'T'hh:mm:ss'Z'"; DateFormat df = new SimpleDateFormat(format); df.setTimeZone(TimeZone.getTimeZone("UTC")); Date d = df.parse(dt); DateTime joda = new DateTime(dt); // Output Sat Jun 11 05:00:00 PDT 2011 System.out.println(joda.toDate()); // Output Fri Jun 10 17:00:00 PDT 2011 System.out.println(d); } }

joda
DateTime进行的,我遇到了一个有趣的情况:

2011-06-11T01:00:00Z
我想知道这是一个错误还是我错过了这里重要的东西?

java date datetime jodatime
2个回答
6
投票
(编辑:更清晰,更正确的答案)

我认为这是因为Joda和Java日期格式在12小时的演示中对待“ 12”。 其中一个将其视为午夜,而另一个则将其视为中午。

改变您对hh

的输入将证明我的假设。


是因为,您是在使用DateTime的构造函数创建JODA时间,该构造依次使用ISO格式解析字符串,为此使用24小时格式:默认格式,Joda

使用了,而您用来构造您的dateFormat Java日期使用

yyyy-MM-dd'T'HH:mm:ss'Z'用于小时字段,这意味着12小时格式。 因此,他们以不同的方式解释“ 12”:12小时格式将其视为中午,而24小时将其视为中午。 最新的更改是将格式更改为使用24小时演示文稿的格式,然后两者都可以正常工作。

您正在尝试将文字解析为文字
Z

,而不是时区偏移。

'Z'

(可能是的缩写
Z

)指定了零时区的偏移,

0
投票
;因此,在日期时间解析/格式化对象中使用模式。检查

+00:00
与了解更多有关它的信息不同。
我应该用什么符号来解析区域偏移字符串?
您应该使用
XXX
来解析不在默认格式的偏移日期字符串中的区域偏移。

区域偏移格式的示例
Pattern


'Z'

Z

-08检查XXX。任何新代码都应使用你不需要java.time
X
X
-0830
XX
-08:30

文献
以了解有关它的更多信息。
在2014年3月,Java 8推出了现代的日期API,该API取代了Error prone legacy
-08:30:15
date timeapi
XXXXX
api.
您的日期时间字符串,

java.time以默认格式(基于ISO8601

标准)。因此,您无需明确使用

java.util
。
您甚至可以直接将其解析为
java.time

DateTimeFormatter

(即不明确使用
2011-06-11T12:00:00Z)。
注:
Instant#parse
不是一个真实的日期对象;它仅代表了时代的毫秒数(1970年1月1日,00:00:00 GMT)。 

DateTimeFormatter

函数使用JVM的默认时区域形成日期时间字符串。
demo:

OffsetDateTime

输出:
ZonedDateTime
在线演示

note

:由于某种原因,如果您需要一个实例

DateTimeFormatter
,请让
java.util.Date
API执行解析日期时间字符串的繁重举重,并且可以使用
Date#toString

.了解更多有关现代日期API的

trail:datetime
.

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.