简而言之
Instant.parse( "2014-09-11T21:28:29.429209Z" )
.atZone( ZoneId.of( "Asia/Kolkata" ) )
.format( DateTimeFormatter.ofPattern("MMM d uuuu hh:mm a z" , Locale.US ) )
请看此处的在 IdeOne.com 上运行的代码。
详情
Jakber的答案在技术上可行,但具有误导性。
ZonedDateTime
用于时区
ZonedDateTime
应该具有指定时区,例如 America/Montreal
或 Pacific/Auckland
。
但是,此输入字符串缺乏时区。结尾处的 Z
是短语 Zulu
的缩写,表示协调世界时 (UTC),换句话说,是与 UTC 偏移量为零小时 (+00:00)。
时区是特定区域的偏移量的历史集合,包括即将发生的偏移更改的规则,如夏令时(DST)等异常情况。
Instant
输入的字符串最好解析为 Instant
,它表示时间轴上的一个时刻,始终处于协调世界时 (UTC)。这个类直接解析这种特定的 ISO 8601 格式的字符串,因此不需要格式化模式。
Instant instant = Instant.parse( "2014-09-11T21:28:29.429209Z" );
调整时区
您可以调整时区以获取一个ZonedDateTime
。
ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = instant.atZone( z );
生成字符串
要生成与输入相同格式的字符串,只需调用Instant::toString()
即可。
String output = instant.toString() ;
如果您需要使用某个地区的墙钟时间进行自定义格式,请使用DateTimeFormatter
与您的自定义格式模式。同时使用ZonedDateTime
。作为良好的习惯,始终指定所需的语言环境,以便在翻译和格式化中考虑人类语言和文化规范。
DateTimeFormatter f = DateTimeFormatter.ofPattern("MMM d uuuu hh:mm a z" , Locale.US );
String output = zdt.format( f );
关于java.time
java.time框架内置于Java 8及以上版本。这些类取代了老旧的传统日期时间类,例如java.util.Date
、Calendar
和SimpleDateFormat
。
Joda-Time 项目现在处于 维护模式,建议迁移到 java.time 类。
要了解更多信息,请参见 Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范是 JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,也不需要 java.sql.*
类。
如何获取 java.time 类?
ThreeTen-Extra项目通过添加额外的类扩展了java.time。该项目是java.time可能未来增加内容的试验场。您可能会在此处找到一些有用的类,如Interval
, YearWeek
, YearQuarter
和更多。