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()
与其他答案相比,它有一些好处:
- 您不需要要求您的客户以格林威治标准时间发送date
- 您不需要显式地将您的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
/ .Calendar
和java.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