Java 使用时区分析日期格式

Java 使用时区分析日期格式,java,date,Java,Date,我正在尝试解析一个带有GMT+100的日期字符串 new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss").parse("Thu Apr 23 2015 11:30:49 GMT+0100") 作为 Thu Apr 23 11:30:49 UTC 2015 如果我在格式中添加z或z或X,它是不可解析的。如果我不加上它,它就被抵消了,一个小时 解析此日期的正确方法是什么 -- 更新:这在两个方面不同:1)这个问题是纯java的,并且会接受除使用Simpl

我正在尝试解析一个带有GMT+100的日期字符串

new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss").parse("Thu Apr 23 2015 11:30:49 GMT+0100")
作为

Thu Apr 23 11:30:49 UTC 2015
如果我在格式中添加z或z或X,它是不可解析的。如果我不加上它,它就被抵消了,一个小时

解析此日期的正确方法是什么

--


更新:这在两个方面不同:1)这个问题是纯java的,并且会接受除使用SimpleDataFormat(即新的java 8功能)以外的答案;2)这里的解决方案与其他问题不同

您的表达式应该是
EEE MMM dd yyyy HH:mm:ss'GMT'Z
(包括引号),因此您的代码如下:

new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss 'GMT'Z").parse("Thu Apr 23 2015 11:30:49 GMT+0100")
这是如何工作的

根据,在
SimpleDataFormat
模式中,在单引号(
)之间传递的任何内容都不会被插值,而是被假定为解析时要忽略的日期格式的一部分


SimpleDateFormat
模式术语中的
+0100
等价物是
Z
您的表达式应该是
EEE MMM dd yyyy HH:mm:ss'GMT'Z
(包括引号),因此您的代码如下:

new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss 'GMT'Z").parse("Thu Apr 23 2015 11:30:49 GMT+0100")
这是如何工作的

根据,在
SimpleDataFormat
模式中,在单引号(
)之间传递的任何内容都不会被插值,而是被假定为解析时要忽略的日期格式的一部分


SimpleDateFormat
模式术语中,与
+0100
等价的是
Z

尝试将格式更改为
EEE-MMM-dd-yyyy-HH:mm:ss'GMT'Z
(带引号)我还必须设置
format.setTimeZone(TimeZone.getTimeZone(“UTC”)
以获得一致的结果,否则date对象将通过toString()显示相同的结果,但通过getTime()关闭一小时。
toString
方法隐藏,隐式应用JVM的当前默认时区。这些类现在是遗留类,被java.time类取代。请搜索堆栈溢出,因为这里已经多次解决了所有这些问题。我已经通过getTime()检查了输出-它也在那里。这不是toString()/本地时区问题。有人问过这方面的变化,但不是完全相同的。。。我做了搜索,但考虑到解析这种格式的目标,仍然可以找到新的答案,特别是如果他们可以使用较新的JDK功能。“最终,我只想要一个稳定的实现,我不会被迫使用SimpleDataFormat。”antonyh在最初的问题上给出了答案。你的问题是这个问题的重复。按照链接到那里。尝试将格式更改为
EEE MMM dd yyy HH:mm:ss'GMT'Z
(带引号)我还必须设置
format.setTimeZone(TimeZone.getTimeZone(“UTC”)
以获得一致的结果,否则date对象将通过toString()显示相同的结果,但通过getTime()关闭一小时。
toString
方法隐藏,隐式应用JVM的当前默认时区。这些类现在是遗留类,被java.time类取代。请搜索堆栈溢出,因为这里已经多次解决了所有这些问题。我已经通过getTime()检查了输出-它也在那里。这不是toString()/本地时区问题。有人问过这方面的变化,但不是完全相同的。。。我做了搜索,但考虑到解析这种格式的目标,仍然可以找到新的答案,特别是如果他们可以使用较新的JDK功能。“最终,我只想要一个稳定的实现,我不会被迫使用SimpleDataFormat。”antonyh在最初的问题上给出了答案。你的问题是这个问题的重复。请按照此处的链接进行操作。您使用的是多年前由java.time类过时的旧日期时间类。有时,在java 8之前,我们只拥有旧java,而不使用额外的库。@BasilBourque请随意使用更现代的java,我已经修改了这个问题,所以它不仅限于SimpleDateFormat(因为我没有被迫使用它),您使用的是麻烦的旧日期时间类,这些类在几年前就被java.time类淘汰了。有时候,麻烦的旧java就是我们所有的,在java 8之前,不使用额外的库。@BasilBourque请随意使用更现代的Java回答,我已经修改了这个问题,所以它不限于SimpleDataFormat(因为我不是被迫使用这个)