如何将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类来取代麻烦的旧遗留日期时间类。 具体来说, GregorianCalendarZonedDateTime替换ZonedDateTime区,而OffsetDateTimeOffsetDateTime为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/MontrealAfrica/CasablancaPacific/Auckland 。 切勿使用3-4字母缩写,例如ESTIST因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

 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.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

使用符合JDBC 4.2或更高版本的JDBC驱动程序 ,您可以直接与数据库交换java.time对象。 不需要字符串也不需要java.sql。*类。

从哪里获取java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • 更高版本的Android捆绑java.time类的实现。
    • 对于早期的Android, ThreeTenABP项目采用ThreeTen-Backport (如上所述)。 请参见如何使用ThreeTenABP ….

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如IntervalYearWeekYearQuarter等。