Java SimpleDateFormat(“yyyy-MM-dd'T'HH:mm:ss'Z'”) gives timezone as IST
我将simpledateformat构造函数设置为
1 |
我正在分析字符串
我读过,这里z代表
现在我的问题是我的输出是对还是错?
您没有设置时区,只是在日期/时间的末尾添加了一个
将时区设置为格林尼治标准时间,它将是正确的。
1 2 | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); sdf.setTimeZone(TimeZone.getTimeZone("GMT")); |
这里把
示例:
从ISO 8601字符串到Java日期对象
1 2 3 | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); sdf.setTimeZone(TimeZone.getTimeZone("GMT")); sdf.parse("2013-09-29T18:46:19Z"); //prints-> Mon Sep 30 02:46:19 CST 2013 |
号
如果不设置
从Java日期对象到ISO 8601字符串
并使用以下代码将
1 2 3 | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US); sdf.setTimeZone(TimeZone.getTimeZone("GMT")); System.out.println(sdf.format(new Date())); //-prints-> 2015-01-22T03:23:26Z |
还请注意,在z
如果您想处理日期的"标准"JSON表示,那么最好使用这个模式:
注意末尾的
与其他答案相比,它有一些好处:
如果你没有选择使用Java8,最好使用'yyyy-mm-dd't'hh:mm:ssxxx'因为这会再次得到正确的解析(而只有一个x,情况可能不是这样……取决于您的解析函数)
X生成:+01
XXX生成:+01:00
DR
其他的答案是过时的,如Java 8。
1 2 3 4 5 | Instant // Represent a moment in UTC. .parse("2013-09-29T18:46:19Z" ) // Parse text in standard ISO 8601 format where the `Z` means UTC, pronounces"Zulu". .atZone( // Adjust from UTC to a time zone. ZoneId.of("Asia/Kolkata" ) ) // Returns a `ZonedDateTime` object. |
。ISO 8601标准
您的字符串格式正好符合ISO 8601标准。本标准定义了将各种日期时间值表示为文本的合理格式。
java.time时间旧的EDCOX1、EDCX1、18、EDCX1、19个类已经被Java.TimeFramework构建成Java 8和更高版本。请参见教程。避免使用旧的类,因为它们被证明是设计糟糕、混乱和麻烦的。
旧类中糟糕的设计有一部分让您感到苦恼,在生成日期时间值的文本表示形式时,
在分析/生成日期时间值的文本表示形式时,java.time类默认使用iso 8601格式。所以不需要指定解析模式。
1 | Instant instant = Instant.parse("2013-09-29T18:46:19Z" ); |
您可以根据需要应用时区来生成
1 2 | ZoneId zoneId = ZoneId.of("America/Montreal" ); ZonedDateTime zdt = instant.atZone( zoneId ); |
。