tl;博士
OffsetDateTime.parse( "2012-06-17T08:00:00.000+01:00" ) // Parse string in standard ISO 8601 format to an object.
.format( // Generate a String representing the value of that `OffsetDateTime` object.
DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ss.SSSXXXXX" ) // Specify a formatting pattern to force the seconds and fractional second even if zero.
) // Return a `String` object.
2012-06-17T08:00:00.000+01:00
java.time
现代方法使用 java.time 类而不是麻烦的旧旧日期时间类。避免使用Date、Calendar 和SimpleDateFormat。
ISO 8601
您想要的格式恰好是标准 ISO 8601 格式。 java.time 类在解析/生成字符串时默认使用标准格式。所以不需要指定格式模式。
OffsetDateTime
您的输入字符串包含偏移量,但不包含时区。所以我们解析为OffsetDateTime 对象。
OffsetDateTime odt = OffsetDateTime.parse( "2012-06-17T08:00:00.000+01:00" ) ;
要生成相同标准 ISO 8601 格式的字符串,只需调用 toString。默认情况下,如果为零,则忽略最不重要的部分。因此,使用您的示例数据不会出现秒或小数秒。
String output = odt.toString() ;
2012-06-17T08:00+01:00
如果您想强制秒和小数秒,即使为零,请指定格式模式。
OffsetDateTime odt = OffsetDateTime.parse( "2012-06-17T08:00:00.000+01:00" );
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ss.SSSXXXXX" );
String output = odt.format( f );
2012-06-17T08:00:00.000+01:00
关于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 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。