我有如下解析日期的代码:
String ALT_DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
SimpleDateFormat sdf = new SimpleDateFormat(
ALT_DATE_TIME_FORMAT);
Date date = sdf.parse(requiredTimeStamp);
它工作正常,突然间,这停止了工作。事实证明,管理员对服务器进行了一些配置更改,当前返回的日期为“2010-12-27T10:50:44.000-08:00”,无法通过上述模式进行解析。我有两个问题:
第一个是什么模式会解析 JVM 以上述格式返回的日期(具体来说,只是“-08:00”作为时区)?其次,在 linux RHEL 5 服务器上究竟会在哪里更改此类设置,以便我们将来知道此类更改?
tl;博士
OffsetDateTime.parse( "2010-12-27T10:50:44.000-08:00" )
ISO 8601
输入字符串格式在ISO 8601标准中定义,这是一个日期时间格式系列。
避免旧的日期时间课程
问题和其他答案使用与最早版本的 Java 捆绑在一起的旧的过时日期时间类。避开它们。现在被 java.time 类取代。
使用 java.time
您的输入字符串以offset-from-UTC结尾。所以我们解析为一个
OffsetDateTime
对象。java.time 类在解析/生成字符串时默认使用 ISO 8601 格式。所以不需要指定格式模式。
OffsetDateTime odt = OffsetDateTime.parse( "2010-12-27T10:50:44.000-08:00" );
如果您想将此日期时间值视为 UTC 时间线上的某个时刻,请提取一个
Instant
.Instant instant = odt.toInstant();
时区是偏移量加上一组用于处理夏令时 (DST) 等异常情况的规则。如果您考虑了时区,请应用 a
ZoneId
来获取ZonedDateTime
对象。时间线上的同一时刻,但通过不同的挂钟时间查看。ZoneId z = ZoneId.of( "America/Montreal" ); ZonedDateTime zdt = odt.atZoneSameInstant( z ); // Same moment on the timeline, but viewed through a different wall-clock time.
关于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-额外项目与其他类扩展java.time。该项目是未来可能添加到 java.time 的试验场。你可能在这里找到一些有用的类,比如
Interval
,YearWeek
,YearQuarter
,和更多。