我有SimpleDateFormat构造函数作为
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
我正在解析字符串 "2013-09-29T18:46:19Z".
我读到这里Z代表GMT/UTC
时区。但是,当我在控制台上打印此日期时,它会为返回的日期打印IST timezne。
现在我的问题是我的输出是对还是错?
我有SimpleDateFormat构造函数作为
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
我正在解析字符串 "2013-09-29T18:46:19Z".
我读到这里Z代表GMT/UTC
时区。但是,当我在控制台上打印此日期时,它会为返回的日期打印IST timezne。
现在我的问题是我的输出是对还是错?
Answers:
您尚未将时区设置为仅将a添加Z
到日期/时间的末尾,因此它看起来像是GMT日期/时间,但这不会更改其值。
将时区设置为GMT,这将是正确的。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
'T'
并'Z'
在此处视为常量。您需要Z
不带引号通过。此外,您需要在输入字符串中指定时区。
示例:2013-09-29T18:46:19-0700
格式为"yyyy-MM-dd'T'HH:mm:ssZ"
-0700
是时区,即-7:00小时
从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日期对象到ISO 8601字符串
并将Date
对象转换为ISO 8601 Standard(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
如果你想处理“ 标准日” JSON表示,则最好使用此模式:"yyyy-MM-dd'T'HH:mm:ssX"
。
请注意X
最后。 它将处理ISO 8601标准中的时区,而ISO 8601正是使用Javascript产生此语句的原因new Date().toJSON()
与其他答案相比,它具有一些优点:
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
play
的自动表单绑定,并使用@Format.DateTime
注释。使用默认模式Z
在结尾处似乎不正确。更改为后X
,它可以工作。非常感谢
从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标准。该标准定义了用于将各种日期时间值表示为文本的合理格式。
Java 8和更高版本中内置的java.time框架已取代了旧的java.util.Date
/ .Calendar
和java.text.SimpleDateFormat
类。请参阅教程。避免使用老式的类,因为事实证明它们的设计拙劣,令人困惑和麻烦。
旧类中的一些较差的设计使您不胜其烦,该toString
方法在生成实际以UTC(GMT)表示的日期时间值的文本表示时,将应用JVM当前的默认时区。好主意但令人困惑。
解析/生成日期时间值的文本表示时,java.time类默认使用ISO 8601格式。因此,无需指定解析模式。
Instant instant = Instant.parse( "2013-09-29T18:46:19Z" );
您可以根据需要应用时区来生成ZonedDateTime
对象。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( zoneId );