tl;博士
OffsetDateTime.parse( "2013-01-09T19:32:49.103+05:30" ) // Parsed.
.toInstant() // Adjusted to UTC.
见live code in IdeOne.com。
ISO 8601
2013-01-09T19:32:49.103+05:30 的输入字符串恰好是标准 ISO 8601 格式。末尾的+05:30 表示提前五个半小时的offset-from-UTC,用于印度。
java.time
您正在使用麻烦的旧日期时间类,现在是遗留的,被 java.time 类取代。
在解析/生成表示日期时间值的字符串时,java.time 类默认使用 ISO 8601 格式。所以根本不需要指定格式模式。
由于您的输入代表时间轴上与 UTC 有偏移的时刻,我们将其解析为 OffsetDateTime 对象。
OffsetDateTime odt = OffsetDateTime.parse( "2013-01-09T19:32:49.103+05:30" );
odt.toString(): 2013-01-09T19:32:49.103+05:30
要获取UTC 值中的简单对象,请提取Instant。这个Instant 类是java.time 的基本构建块类。 Instant 类代表UTC 时间线上的时刻,分辨率为nanoseconds(最多九 (9) 位小数)。
您可以将OffsetDateTime 视为Instant 加上ZoneOffset。
Instant instant = odt.toInstant(); // UTC.
调用toString 时,会以标准ISO 8601 格式生成String 对象。末尾的Z 是Zulu 的缩写,表示UTC。
instant.toString(): 2013-01-09T14:02:49.103Z
Instant 在各种方面受到限制,例如在生成各种格式的字符串时。因此,您可能希望将OffsetDateTime 调整为UTC 作为其偏移量;换句话说,零偏移量。 ZoneOffset 类包含一个 UTC 常量 ZoneOffset.UTC。
OffsetDateTime odtUtc = odt.withOffsetSameInstant( ZoneOffset.UTC );
您还可以对Instant 应用偏移量(或时区)。致电atOffset 或atZone。
Instant 类是 java.time 的基本构建块类。可能经常在您的代码中使用,因为最佳实践是在 UTC 中完成大部分工作。
OffsetDateTime odt = instant.atOffset( ZoneOffset.ofHoursMinutes( 5 , 30 ) );
时区
请注意,与 UTC 的偏移不是时区。时区是一个偏移量加上一组规则,过去和现在,用于处理异常,例如Daylight Saving Time (DST)。因此,如果您确实确定正确的时区,则时区总是比仅仅偏移更可取。
以continent/region 的格式指定proper time zone name,例如America/Montreal、Africa/Casablanca 或Pacific/Auckland。切勿使用 3-4 个字母的缩写,例如 EST 或 IST,因为它们不是真正的时区,没有标准化,甚至不是唯一的 (!)。
如果您知道预期的时区,请应用 ZoneId 以获取 ZonedDateTime 对象。但千万不要假设没有验证输入数据的来源。许多不同的区域可能共享一个特定的偏移量。例如,在我们在这里输入的情况下,偏移量 +05:30 今天恰好在印度 (Asia/Kolkata) 和斯里兰卡 (Asia/Colombo) 中使用。对于过去、现在或未来的不同异常,这两个时区可能有不同的规则。
ZoneId z = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = odt.atZoneSameInstant( z );
ZonedDateTime 的 toString 方法以一种明智的方式扩展了标准 ISO 8601 格式,方法是在方括号中附加时区名称。在这种情况下,[Asia/Kolkata]。
zdt.toString(): 2013-01-09T19:32:49.103+05:30[亚洲/加尔各答]
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于 maintenance mode,建议迁移到 java.time。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。