tl;dr
LocalDateTime.parse( "2016-09-25 17:26:12".replace( " " , "T" ) )
.atZoneSameInstant( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM ) )
避免遗留日期时间类
您正在使用与最早版本的 Java 捆绑在一起的麻烦的旧日期时间类。现在被 java.time 类取代。
ISO 8601
您输入的字符串几乎符合标准ISO 8601java.time 类默认使用的格式。将中间的空格替换为T
.
String input = "2016-09-25 17:26:12".replace( " " , "T" );
LocalDateTime
输入缺少任何指示与 UTC 的偏移量 or 时区。所以我们解析为LocalDateTime.
LocalDateTime ldt = LocalDateTime.parse( input );
OffsetDateTime
您声称从应用程序的上下文中知道该日期时间值的目的是UTC。所以我们将该偏移量指定为常量ZoneOffset.UTC成为一个OffsetDateTime.
OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC );
ZonedDateTime
您还说您希望将此值调整为用户 JVM(或本例中的 Android 运行时)的当前默认时区。知道这个默认值可以随时更改during您的应用程序的执行。如果时区很重要,您应该明确询问用户所需/预期的时区。这ZoneId
类代表一个时区。
ZoneId z = ZoneId.systemDefault(); // Or, for example: ZoneId.of( "America/Montreal" )
ZonedDateTime zdt = odt.atZoneSameInstant( z );
生成字符串
你说你想生成一个字符串来表示这个日期时间值。您可以指定任何您想要的格式。但通常最好让 java.time 根据定义的人类语言和文化规范自动为您本地化。Locale目的。使用FormatStyle指定长度或缩写(FULL
, LONG
, MEDIUM, SHORT
).
Locale locale = Locale.getDefault(); // Or, for example: Locale.CANADA_FRENCH
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM ).withLocale( locale );
String output = zdt.format( f );
关于 java.time
The java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧日期时间类,例如java.util.Date, .Calendar, & java.text.SimpleDateFormat.
The 乔达时间项目,现在在维护模式,建议迁移到 java.time。
要了解更多信息,请参阅甲骨文教程。并在 Stack Overflow 上搜索许多示例和解释。
许多 java.time 功能都向后移植到 Java 6 和 7三十后端口并进一步适应Android in 三十ABP (see 如何使用…).
The 三十额外项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如Interval, YearWeek, YearQuarter, and more.