Java SimpleDateFormat(“yyyy-MM-dd'T'HH:mm:ss'Z”)给出时区为IST

我有SimpleDateFormat构造函数

SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") 

我正在parsingstring"2013-09-29T18:46:19Z".

我已经读过,这里Z代表GMT/UTC时区。 但是当我在控制台上打印这个date,它打印返回date的IST时间。

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

您没有设置时区只在date/时间的末尾添加了Z ,所以它将看起来像GMTdate/时间,但是这不会更改该值。

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

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

'T''Z'在这里被认为是常量。 你需要通过Z没有引号。 而且你需要在inputstring中指定时区。

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

如果你想处理date的“ 标准 ”JSON表示,那么最好使用这种模式: "yyyy-MM-dd'T'HH:mm:ssX"

注意X到底。 它将处理ISO 8601标准的时区 ,而ISO 8601正是在Javascript中产生这个语句的new Date().toJSON()

与其他答案相比,它有一些好处:

  1. 您不需要要求您的客户以格林威治标准时间发送date
  2. 您不需要显式地将您的date对象转换为GMT使用: sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

从ISO 8601string到Javadate对象

 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

从Javadate对象到ISO 8601string

并将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 

还要注意的是,如果没有' '在Z yyyy-MM-dd'T'HH:mm:ssZ打印2015-01-22T03:41:02+0000

其他的答案在Java 8中已经过时了。

ISO 8601

您的string格式恰好符​​合ISO 8601标准。 该标准定义了以文本forms表示各种date时间值的合理格式。

java.time

旧的java.util.Date / .Calendarjava.text.SimpleDateFormat类已被Java 8及更高版本中构build的java.time框架所取代。 参见教程 。 避免旧的课程,因为他们已被certificate是devise不佳,混乱,麻烦。

在旧类中糟糕的devise的一部分已经咬你,其中toString方法应用JVM的当前默认时区生成实际上是UTC(GMT)的date时间值的文本表示forms; 善意但令人困惑。

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

Instant是UTC时间线上的一个时刻。

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

您可以根据需要应用时区以生成ZonedDateTime对象。

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

如果你没有select继续java8更好地使用'yyyy-MM-dd'T'HH:mm:ssX XX ',因为这将得到正确的parsing(而只有一个X,这可能不是这种情况。 ..取决于你的parsingfunction)

X生成:+01

XXX会生成:+01:00