如何将dateTime类型转换为gregorianCalendar

时间:2012-05-29 14:49:55

标签: java datetime gregorian-calendar

我在字符串中得到的时间是“2011-02-27T10:03:33.099-06:00”,这是xml dateTime类型。我也有TimeZone类型的时区。我应该如何在该时区将dateTime转换为GregorianCalendar java类型。

3 个答案:

答案 0 :(得分:2)

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 docs开始,我希望

sdf = new java.text.SimpleDateFormat ("yyyy-MM-dd'T'HH:mm:ss.SSSz");

用于最后读取-06:00。但是我看到,在预期的0700形式中存在偏移,或者使用GMT的前缀,例如“GMT-04:00”。所以你必须自己插入GMT-thingy:

sdf.parse (sd.replaceAll ("(......)$", "GMT$1"))

SDF.parse(str)返回一个Date,必须将其转换为GC:

GregorianCalendar calendar = new GregorianCalendar ();
calendar.setTime (date);

答案 1 :(得分:2)

Java内置了用于解析xml日期时间的代码:使用DatatypeConverter.parseDateTime()。这将在解析的TimeZone中返回一个日历。然后,您可以将日历时区设置为您想要的下一个目标TimeZone。

答案 2 :(得分:0)

TL;博士

OffsetDateTime.parse( "2011-02-27T10:03:33.099-06:00" )

java.time

现代方法使用 java.time 类来取代麻烦的旧遗留日期时间类。具体来说,GregorianCalendarZonedDateTime替换为时区,而OffsetDateTime仅替换为来自UTC的偏移量。

ISO 8601

您的输入字符串恰好符合ISO 8601标准格式。

java.time 类在解析/生成字符串时默认使用这些标准格式。因此无需指定格式化模式。

OffsetDateTime

您的输入字符串包含offset-from-UTC,但不包含time zone。因此解析为OffsetDateTime

OffsetDateTime odt = OffsetDateTime.parse( "2011-02-27T10:03:33.099-06:00" ) ;

ZonedDateTime

如果您确定知道预期的时区,请应用ZoneId制作ZonedDateTime

时区总是优于仅仅偏移。区域是特定区域人员使用的偏移的过去,现在和将来变化的历史记录。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

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及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

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

从哪里获取java.time类?

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