如何将dateTime类型转换为gregorianCalendar
我正在使用xml dateTime类型的“2011-02-27T10:03:33.099-06:00”这样的字符串。 我也有TimeZone类型的时区。 我应该如何在该时区将dateTime转换为GregorianCalendar java类型。
Java内置了用于解析xml日期时间的代码:使用DatatypeConverter.parseDateTime() 。 这将在解析的TimeZone中返回一个日历。 然后,您可以将Calendar TimeZone设置为您想要的目标TimeZone,以满足您下次需要做的任何事情。
sdf = new java.text.SimpleDateFormat ("yyyy-MM-dd'T'HH:mm:ss.S");
解析一切,除了尾随TZ。
sdf.parse (sd); res168: java.util.Date = Sun Feb 27 10:03:33 CET 2011
从api文档中 ,我会期待
sdf = new java.text.SimpleDateFormat ("yyyy-MM-dd'T'HH:mm:ss.SSSz");
最后用于读取-06:00。 但是我看到,在预期的0700forms中存在偏移,或者使用GMT的前缀,例如“GMT-04:00”。 所以你必须自己插入GMT-thingy:
sdf.parse (sd.replaceAll ("(......)$", "GMT$1"))
SDF.parse(str)返回一个Date,必须将其转换为GC:
GregorianCalendar calendar = new GregorianCalendar (); calendar.setTime (date);
TL;博士
OffsetDateTime.parse( "2011-02-27T10:03:33.099-06:00" )
java.time
现代方法使用java.time类来取代麻烦的旧遗留日期时间类。 具体来说, GregorianCalendar
被ZonedDateTime
替换ZonedDateTime
区,而OffsetDateTime
仅OffsetDateTime
为UTC的偏移量。
ISO 8601
您的输入字符串恰好符合ISO 8601标准格式。
在解析/生成字符串时, java.time类在默认情况下使用这些标准格式。 因此无需指定格式化模式。
OffsetDateTime
您的输入字符串包含UTC的偏移量 ,但不包含时区 。 因此解析为OffsetDateTime
。
OffsetDateTime odt = OffsetDateTime.parse( "2011-02-27T10:03:33.099-06:00" ) ;
ZonedDateTime
如果您确定知道预期的时区,请应用ZoneId
以生成ZonedDateTime
。
时区总是优于仅仅偏移。 区域是特定区域的人员使用的偏移的过去,现在和将来变化的历史。
以continent/region
的格式指定适当的时区名称 ,例如America/Montreal
, Africa/Casablanca
或Pacific/Auckland
。 切勿使用3-4字母缩写,例如EST
或IST
因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "Pacific/Galapagos" ) ; ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;
转换传统↔现代
如果必须有一个GregorianCalendar
对象与尚未更新到java.time的旧代码进行交互操作,则可以进行转换。 查看添加到旧类的新方法。
GregorianCalendar myGregCal = GregorianCalendar.from( zdt ) ;
走向另一个方向……
ZonedDateTime zdt = myGregCal.toZonedDateTime() ;
关于java.time
java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。
使用符合JDBC 4.2或更高版本的JDBC驱动程序 ,您可以直接与数据库交换java.time对象。 不需要字符串也不需要java.sql。*类。
从哪里获取java.time类?
- Java SE 8 , Java SE 9及更高版本
- 内置。
- 带有捆绑实现的标准Java API的一部分。
- Java 9增加了一些小function和修复。
- Java SE 6和Java SE 7
- 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
- Android的
- 更高版本的Android捆绑java.time类的实现。
- 对于早期的Android, ThreeTenABP项目采用ThreeTen-Backport (如上所述)。 请参见如何使用ThreeTenABP ….
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如Interval
, YearWeek
, YearQuarter
等。