我SimpleDateFormat的构造函数的Java的SimpleDateFormat( “YYYY-MM-dd'T'HH:MM:ss'Z'”)给出了时区为IST
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
和我解析字符串"2013-09-29T18:46:19Z".
我已经读过,这里Z代表GMT/UTC
时区。但是当我在控制台上打印这个日期时,它会打印返回日期的IST时间。
现在我的问题是我的输出是对还是错?
我SimpleDateFormat的构造函数的Java的SimpleDateFormat( “YYYY-MM-dd'T'HH:MM:ss'Z'”)给出了时区为IST
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
和我解析字符串"2013-09-29T18:46:19Z".
我已经读过,这里Z代表GMT/UTC
时区。但是当我在控制台上打印这个日期时,它会打印返回日期的IST时间。
现在我的问题是我的输出是对还是错?
您没有设置时区仅增加了Z
到的日期/时间结束,所以它看起来像一个GMT日期/时间,但是这并未不会改变价值。
将时区设置为GMT,它将是正确的。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
如果你有一个日期,比如2012-12-06T06:00:00没有Z,那么代表GMT? – binarygiant
@binarygiant你将不得不问那些谁发送它。这可能是发件人的当地时间。 –
时区可以设置为“UTC” – Prashanth
'T'
和'Z'
在这里被认为是常量。你需要通过Z
没有引号。此外,您需要在输入字符串中指定时区。
例子:2013-09-29T18:46:19-0700
而且格式"yyyy-MM-dd'T'HH:mm:ssZ"
Subir,谢谢你的回答,但什么是“0700”附加到输入字符串? –
'-0700'是时区,即-7:00小时 –
为-07:00小时,而不是-0700它将如下: yyyy-MM-dd'T'HH:mm:ss.SSSXXX – Tastybrownies
从ISO 8601字符串到Java Date对象
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对象,以ISO 8601字符串
并将其转换为Date
对象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
还要注意,如果没有' '
在ž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"));
其他答案是过时的Java 8。
你的字符串格式恰好符合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");
根据需要产生ZonedDateTime
对象,你可以申请一个time zone。
ZoneId zoneId = ZoneId.of("America/Montreal");
ZonedDateTime zdt = instant.atZone(zoneId);
,如果你没有去java8选择更好的使用 'YYYY-MM-dd'T'HH:MM:SSX XX',因为这被正确地重新分析(用时只有一个X,这可能不是根据您的分析功能
X产生的情况下...):+01
XXX产生:+01:00
是的,这就是 'Z' 代表。 Z-时区 – Woody
Z =祖鲁时间=> GMT + 0,你显然没有为你的国家服务;) – MushyPeas