tl;博士
OffsetDateTime.parse( "2013-04-03T17:04:39.9430000+03:00" ).format( DateTimeFormatter.ofPattern( "dd.MM.uuuu HH:mm" ) )
ISO 8601
正如其他人所说,您的格式一点也不奇怪。事实上,它是一种标准格式。该格式是ISO 8601 格式定义的集合之一。
微秒
秒的小数部分的这七个数字,.9430000,代表nanoseconds。与 Java 的最早版本 (java.util.Date/.Calendar/java.text.SimpleDateFormat) 捆绑在一起的旧日期时间类仅适用于 milliseconds(三位小数)。旧类无法处理您的此类输入值。
java.time
幸运的是,Java 现在有更新的日期时间类来取代那些旧类。新的在java.time 框架中。这些新类可以处理纳秒(最多九位小数),所以没有问题。
java.time 框架内置于 Java 8 及更高版本中。在JSR 310 中定义。大部分功能在ThreeTen-Backport 项目中向后移植到Java 6 和7,并在ThreeTenABP 项目中进一步适用于Android。
OffsetDateTime
OffsetDateTime 表示时间轴上带有offset-from-UTC 的时刻。您的输入字符串2013-04-03T17:04:39.9430000+03:00 的偏移量比UTC 早三个小时。
java.time 类在解析/生成字符串时默认使用 ISO 8601 格式。所以不需要定义格式化模式。我们可以直接解析那个字符串。
OffsetDateTime odt = OffsetDateTime.parse( "2013-04-03T17:04:39.9430000+03:00" );
生成字符串
要生成相同样式的字符串表示,请调用其toString 方法。
为不同的格式定义格式模式。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "dd.MM.uuuu HH:mm" );
String output = odt.format( formatter );
时区
请注意,您的输入具有与 UTC 的偏移量,但不是真正的时区。时区是用于处理夏令时 (DST) 等异常情况的偏移量加上规则。对于真正的时区,请使用ZoneId 获取ZonedDateTime。在 Stack Overflow 上搜索许多示例。
关于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。