如何将2010-12-15T16:26:49.841-08:00转换为Java中的GregoriaCalendar?
我有一个字符串日期“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
从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.