如何将2010-12-15T16:26:49.841-08:00转换为Java中的GregoriaCalendar?

如何将2010-12-15T16:26:49.841-08:00转换为Java中的GregoriaCalendar?,java,parsing,datetime,iso8601,gregorian-calendar,Java,Parsing,Datetime,Iso8601,Gregorian Calendar,我有一个字符串日期“2010-12-15T16:26:49.841-08:00”,我需要将其转换为Java中的GregoriaCalendar。你是怎么做到的 从Jesper的回答中寻找答案 使用joda time的解决方案代码: DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ").withOffsetParsed(); DateTime date = formatter.p

我有一个字符串日期“2010-12-15T16:26:49.841-08:00”,我需要将其转换为Java中的GregoriaCalendar。你是怎么做到的


从Jesper的回答中寻找答案

使用joda time的解决方案代码:

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ").withOffsetParsed();
DateTime date = formatter.parseDateTime("2010-12-15T16:26:49.841-08:00");

使用SimpleDataFormat,请参见此处的javadocs:

然后将日期转换为日历。这里有很多例子:


您可以尝试使用这段代码

DateTimeFormatter formatter =
    DateTimeFormat.forPattern("your pattern").withOffsetParsed();
DateTime dateTime = formatter.parseDateTime("your input");
GregorianCalendar cal = dateTime.toGregorianCalendar();

这将巧妙地为您提供Gregorian Calendar对象

不幸的是,标准的
SimpleDataFormat
类无法很好地处理。具体来说,它无法处理末尾时区偏移中的

 String dateTimeString="2010-12-15T16:26:49.841-08:00"; 

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

 DateTime dateTime = formatter.parseDateTime(dateTimeString);

 GregorianCalendar cal = dateTime.toGregorianCalendar();
您可以做的是手动从时区偏移量中删除
,以便获得如下所示的字符串:

2010-12-15T16:26:49.841-0800

(请注意,时区偏移是
-0800
,而不是
-08:00
)。然后,您可以使用格式为
yyyy-MM-dd'HH:MM:ss.SSSZ
SimpleDateFormat
对其进行解析


但最好使用流行的图书馆来处理时间和日期;它比标准的JavaAPI日期和日历类好得多,并且可以正确处理ISO8601格式。

其他答案是正确的,但现在已经过时。他们使用现在被java.time框架取代的麻烦的旧类

使用java.time 输入字符串恰好符合标准格式。因此无需指定格式化模式,因为java.time类在解析/生成字符串时默认使用ISO8601

输入字符串包含UTC的偏移量,因此我们将其解析为
OffsetDateTime

String input = "2010-12-15T16:26:49.841-08:00" ;
OffsetDateTime odt = OffsetDateTime.parse( input );
如果您心中有一个特定的时区,而不仅仅是UTC的偏移量,请应用该时区

ZoneId zoneId = ZoneId.of( "America/Los_Angele" );
ZonedDateTime zdt = odt.atZone( zoneId );
gregorianalendar
您应该避免使用旧的日期时间类,例如
gregorianalendar
。但是,如果您必须与尚未为java.time更新的旧代码进行互操作,则可以转换。使用添加到旧类中的新方法进行转换。有关更多信息和漂亮的图表,请参阅我的和

关于java.time 该框架内置于Java8及更高版本中。这些类取代了旧的麻烦的日期时间类,如
java.util.date
.Calendar
,&
java.text.SimpleDateFormat

该项目现已启动,建议迁移到java.time

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释

大部分java.time功能都在中向后移植到java 6和7,并进一步适应于中


该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如
Interval
YearWeek
YearQuarter
,等等。

仅供参考,该格式是。转换应该存在于任何像样的XML API中(以及其他地方)。实际上,我认为这是ISO 8601@Andrew White XML dateTime主要是8601的一个特定子集,即
'-'?yyyy'-'mm'-'dd'T'hh':'mm':'ss('.'s+)?(zzzz)?
。我想这个问题已经被问了很多次了。嘿,看看下面——我们的第一个“使用JodaTime”答案…@andersoj:答案容易记忆的问题很少被标记为重复的,这不是很有趣吗。一定与积分累积有关。你试过了吗?它甚至不编译。您可能想提及您正在使用Joda时间类。您可能想提及您在这里使用的是Joda时间类,而不是标准的Java API类。
SimpleDataFormat
不正确支持ISO 8601格式。请注意,对于未来的读者,使用Java 7,您可以使用与ISO-8601格式相对应的“Z”说明符。
Calendar cal = java.util.GregorianCalendar.from( zdt );  // Do such conversions out of java.time only if absolutely necessary.