TL;博士
其他答案在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
旧的ZonedDateTime/.Calendar和java.text.SimpleDateFormat类已被Java 8及更高版本中内置的java.time框架取代。 请参阅教程。 避免使用旧类,因为它们已被证明设计糟糕,令人困惑且麻烦。
旧类中的部分糟糕设计已经咬了你,ZonedDateTime方法在生成实际为UTC(GMT)的日期时间值的文本表示时应用JVM的当前默认时区; 善意但令人困惑。
在解析/生成日期时间值的文本表示时,java.time类默认使用ISO 8601格式。 因此无需指定解析模式。
ZonedDateTime是UTC时间轴上的一个时刻。
Instant instant = Instant.parse( "2013-09-29T18:46:19Z" );
您可以根据需要应用时区来生成ZonedDateTime对象。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( zoneId );