我有SimpleDateFormat构造函数为
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
我正在解析字符串“2013-09-29T18:46:19Z”。
我读到这里Z表示GMT/UTC时区。但是当我在控制台打印这个日期时,它为返回的日期打印IST时区。
现在我的问题是我的输出是对的还是错的?
我有SimpleDateFormat构造函数为
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
我正在解析字符串“2013-09-29T18:46:19Z”。
我读到这里Z表示GMT/UTC时区。但是当我在控制台打印这个日期时,它为返回的日期打印IST时区。
现在我的问题是我的输出是对的还是错的?
当前回答
如果你没有选择去java8更好的使用 'yyyy-MM-dd' t ' hh:mm:ssXXX',因为这将再次被正确解析(而只有一个X可能不是这种情况……取决于你的解析函数)
X生成:+01
XXX生成:+01:00
其他回答
如果你想处理日期的“标准”JSON表示,那么最好使用这个模式:"yyyy-MM-dd' t ' hh:mm:ssX"。
注意结尾的X。它将处理ISO 8601标准的时区,而ISO 8601正是在Javascript new Date().toJSON()中产生这条语句的原因。
与其他答案相比,它有一些好处:
您不需要要求您的客户端以GMT发送日期 你不需要使用这个显式地转换你的Date对象到GMT: sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
“T”和“Z”在这里被认为是常数。你需要传递不带引号的Z。此外,您需要在输入字符串中指定时区。
例如:2013-09-29T18:46:19-0700 格式为"yyyy-MM-dd 'HH:mm:ssZ"
你没有设置时区,只是在日期/时间的末尾添加了一个Z,所以它看起来像一个GMT日期/时间,但这不会改变值。
将时区设置为GMT,将是正确的。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
如果你没有选择去java8更好的使用 'yyyy-MM-dd' t ' hh:mm:ssXXX',因为这将再次被正确解析(而只有一个X可能不是这种情况……取决于你的解析函数)
X生成:+01
XXX生成:+01:00
从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日期对象到ISO 8601字符串
将Dateobject转换为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
另外请注意,没有' ' at Z yyyy-MM-dd' t ' hh:mm:ssZ打印2015-01-22 t03 . 41:02+0000