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

问题描述 投票:118回答:6

我有SimpleDateFormat构造函数

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

我正在解析字符串"2013-09-29T18:46:19Z".

我读过这里Z代表GMT/UTC时区。但是当我在控制台上打印这个日期时,它会为返回的日期打印IST timezne。

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

java date timezone date-format simpledateformat
6个回答
201
投票

您尚未设置时区仅在日期/时间结束时添加了Z,因此它看起来像GMT日期/时间,但这不会更改值。

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

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

77
投票

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

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


39
投票

从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 Date Object到ISO 8601 String

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

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


34
投票

如果你想处理日期的'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. 您无需使用以下命令将Date对象显式转换为GMT:sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

14
投票

如果你没有选择继续使用java8,请更好地使用'yyyy-MM-dd'T'HH:mm:ssXXX',因为这会再次被正确解析(而只有一个X,这可能不是这种情况.. 。取决于你的解析功能)

X生成:+01

XXX生成:+01:00


12
投票

tl;dr

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

Instant                           // Represent a moment in UTC. 
.parse( "2013-09-29T18:46:19Z" )  // Parse text in standard ISO 8601 format where the `Z` means UTC, pronounces “Zulu”.
.atZone(                          // Adjust from UTC to a time zone. 
    ZoneId.of( "Asia/Kolkata" )
)                                 // Returns a `ZonedDateTime` object. 

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格式。因此无需指定解析模式。

InstantUTC时间轴上的一个时刻。

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

您可以根据需要应用time zone来生成ZonedDateTime对象。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( zoneId );
© www.soinside.com 2019 - 2024. All rights reserved.