我有SimpleDateFormat构造函数
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
我正在解析字符串"2013-09-29T18:46:19Z".
我读过这里Z代表GMT/UTC
时区。但是当我在控制台上打印这个日期时,它会为返回的日期打印IST timezne。
现在我的问题是我的输出是对还是错?
您尚未设置时区仅在日期/时间结束时添加了Z
,因此它看起来像GMT日期/时间,但这不会更改值。
将时区设置为GMT,这将是正确的。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
'T'
和'Z'
在这里被认为是常数。你需要通过没有引号的Z
。此外,您需要在输入字符串中指定时区。
示例:2013-09-29T18:46:19-0700
格式为"yyyy-MM-dd'T'HH:mm:ssZ"
从ISO 8601字符串到Java日期对象
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
如果你没有设置TimeZone.getTimeZone("GMT")
那么它将输出Sun Sep 29 18:46:19 CST 2013
从Java Date Object到ISO 8601 String
并将Date
object转换为ISO 8601标准(yyyy-MM-dd'T'HH:mm:ss'Z'
)使用以下代码
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 yyyy-MM-dd'T'HH:mm:ssZ
打印2015-01-22T03:41:02+0000
如果你想处理日期的'standard'JSON表示,那么最好使用这个模式:"yyyy-MM-dd'T'HH:mm:ssX"
。
最后请注意X
。 It will handle timezones in ISO 8601 standard和ISO 8601正是在Javascript new Date().toJSON()
中生成此语句的原因
与其他答案相比,它有一些好处:
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
如果你没有选择继续使用java8,请更好地使用'yyyy-MM-dd'T'HH:mm:ssXXX',因为这会再次被正确解析(而只有一个X,这可能不是这种情况.. 。取决于你的解析功能)
X生成:+01
XXX生成:+01:00
其他答案在Java 8中已经过时了。
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标准。该标准定义了用于将各种日期时间值表示为文本的合理格式。
旧的java.util.Date
/ .Calendar
和java.text.SimpleDateFormat
类已被Java 8及更高版本中内置的java.time框架所取代。见Tutorial。避免使用旧类,因为它们已被证明设计糟糕,令人困惑且麻烦。
旧类中糟糕设计的一部分已经咬了你,当生成实际为UTC(GMT)的日期时间值的文本表示时,toString
方法应用JVM的当前默认时区;善意但令人困惑。
在解析/生成日期时间值的文本表示时,java.time类默认使用ISO 8601格式。因此无需指定解析模式。
Instant instant = Instant.parse( "2013-09-29T18:46:19Z" );
您可以根据需要应用time zone来生成ZonedDateTime
对象。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( zoneId );