shi*_*ter 10 java timezone datetime iso8601 date-format
我有解析日期的代码如下:
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);
Run Code Online (Sandbox Code Playgroud)
它工作正常,突然,这停止了工作.事实证明,管理员在服务器上进行了一些配置更改,并且当前正在返回日期为"2010-12-27T10:50:44.000-08:00",这是上述模式无法解析的.我有两个问题:
第一个是什么模式将以上述格式解析JVM返回的日期(具体来说,只是'-08:00'作为时区)?第二,在Linux RHEL 5服务器上究竟会改变这样的设置,以便我们在将来意识到这些变化?
Bas*_*que 11
OffsetDateTime.parse( "2010-12-27T10:50:44.000-08:00" )
Run Code Online (Sandbox Code Playgroud)
输入字符串格式在ISO 8601标准中定义,该标准是一系列日期时间格式.
问题和其他答案使用与最早版本的Java捆绑在一起的旧的过时日期时间类.避免他们.现在取代了java.time类.
您的输入字符串以与UTC的偏移量结束.所以我们解析为一个OffsetDateTime
对象.
在解析/生成字符串时,java.time类默认使用ISO 8601格式.因此无需指定格式化模式.
OffsetDateTime odt = OffsetDateTime.parse( "2010-12-27T10:50:44.000-08:00" );
Run Code Online (Sandbox Code Playgroud)
如果要在UTC时间轴上查看此日期时间值,请提取Instant
.
Instant instant = odt.toInstant();
Run Code Online (Sandbox Code Playgroud)
时区是偏移量加上一组用于处理诸如夏令时(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.
Run Code Online (Sandbox Code Playgroud)
该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
,和更多.
另一个应用程序使用 ISO 8601 日期时间格式。我假设其他应用程序正在向您发送符合 XML Schema 的 dateTime 类型(即 ISO 8601)的 XML 响应。现在,众所周知,DateFormat 无法解析此格式。您必须使用其他库,例如 joda-time (joda-time 是获胜者)或其他响应中指定的 FastDateFormat。看看这篇文章Converting ISO 8601-driven String to java.util.Date
归档时间: |
|
查看次数: |
25586 次 |
最近记录: |