2013-10-01 20 views
73

我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时间。

现在我的问题是我的输出是对还是错?

+2

是的,这就是 'Z' 代表。 Z-时区 – Woody

+0

Z =祖鲁时间=> GMT + 0,你显然没有为你的国家服务;) – MushyPeas

回答

124

您没有设置时区仅增加了Z到的日期/时间结束,所以它看起来像一个GMT日期/时间,但是这并未不会改变价值。

将时区设置为GMT,它将是正确的。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); 
sdf.setTimeZone(TimeZone.getTimeZone("GMT")); 
+2

如果你有一个日期,比如2012-12-06T06:00:00没有Z,那么代表GMT? – binarygiant

+2

@binarygiant你将不得不问那些谁发送它。这可能是发件人的当地时间。 –

+2

时区可以设置为“UTC” – Prashanth

55

'T''Z'在这里被认为是常量。你需要通过Z没有引号。此外,您需要在输入字符串中指定时区。

例子:2013-09-29T18:46:19-0700 而且格式"yyyy-MM-dd'T'HH:mm:ssZ"

+0

Subir,谢谢你的回答,但什么是“0700”附加到输入字符串? –

+0

'-0700'是时区,即-7:00小时 –

+4

为-07:00小时,而不是-0700它将如下: yyyy-MM-dd'T'HH:mm:ss.SSSXXX – Tastybrownies

23

从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

26

如果你想处理“standard”日期的JSON表示,则最好使用此模式:"yyyy-MM-dd'T'HH:mm:ssX"

最后注意到XIt will handle timezones in ISO 8601 standard,以及ISO 8601正是在Javascript new Date().toJSON()

相较于其他的答案产生这种说法有一些好处:

  1. 你并不需要要求您的客户在GMT
  2. 发送日期您不需要明确地将日期对象转换为GMT使用此:sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
+0

我使用'play'的自动表单绑定,并使用'@ Format.DateTime'注释。在结尾处使用默认模式与'Z'似乎是不正确的。更改为'X'后,它可以工作。非常感谢 – transang

+0

如果您的日期以符合RFC822的方式(如“-0500”)指定时区,则此工作正常。但是,对于诸如“2013-07-15T10:22:17-05:00”(也是有效的ISO8601 TZ)的日期,这会中断。在这种情况下,您需要使用“yyyy-MM-dd'T'HH:mm:ssXXX”。 – Lambart

7

其他答案是过时的Java 8。

ISO 8601

你的字符串格式恰好符​​合ISO 8601标准。该标准定义了用于将各种日期时间值表示为文本的合理格式。

java.time

java.util.Date/.Calendarjava.text.SimpleDateFormat类已取代通过内置到Java 8和后来的java.time框架。见Tutorial避免旧的课程,因为他们已被证明设计不佳,令人困惑和麻烦。

在生成实际为UTC(GMT)的日期时间值的文本表示形式时,toString方法会应用JVM的当前默认时区,这是旧类中糟糕设计的一部分已经咬伤您。善意但令人困惑。

在解析/生成日期时间值的文本表示时,java.time类默认使用ISO 8601格式。所以不需要指定解析模式。

Instant是时间轴上的时刻UTC

Instant instant = Instant.parse("2013-09-29T18:46:19Z"); 

根据需要产生ZonedDateTime对象,你可以申请一个time zone

ZoneId zoneId = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = instant.atZone(zoneId); 
3

,如果你没有去java8选择更好的使用 'YYYY-MM-dd'T'HH:MM:SSX XX',因为这被正确地重新分析(用时只有一个X,这可能不是根据您的分析功能

X产生的情况下...):+01

XXX产生:+01:00

相关问题