我在字符串中得到的时间是“2011-02-27T10:03:33.099-06:00”,这是xml dateTime类型。我也有TimeZone类型的时区。我应该如何在该时区将dateTime转换为GregorianCalendar java类型。
答案 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)
OffsetDateTime.parse( "2011-02-27T10:03:33.099-06:00" )
现代方法使用 java.time 类来取代麻烦的旧遗留日期时间类。具体来说,GregorianCalendar
被ZonedDateTime
替换为时区,而OffsetDateTime
仅替换为来自UTC的偏移量。
您的输入字符串恰好符合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/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用诸如EST
或IST
之类的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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance 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的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。