我正在尝试转换此字符串:
2011-06-07T14:08:59.697-07:00
到Java日期,到目前为止,这就是我所做的:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S");
Date date1 = sdf.parse("2011-06-07T14:08:59.697", new java.text.ParsePosition(0));
几乎一切都很好,除了最重要的部分,时区 !!
SimpleDateFormat的问题在于它期望+/-hhmm
中的TimeZone和我的格式为+/-hh:mm
。
另外,我不知道为什么,这有效:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S Z");
Date date1 = sdf.parse("2011-06-07T14:08:59.697 -0700", new java.text.ParsePosition(0));
但这不是(时区之前的空间):
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SZ");
Date date1 = sdf.parse("2011-06-07T14:08:59.697-0700", new java.text.ParsePosition(0));
将此日期2011-06-07T14:08:59.697-07:00
转换为java日期的正确格式是什么?
感谢您的帮助!
答案 0 :(得分:5)
它看起来像在ISO中使用的ISO 8601标准日期和时间格式。遗憾的是,Java的SimpleDateFormat
不能正确支持该格式,因为它无法处理时区中的冒号。
但是,javax.xml
包中包含可以处理此格式的类。
String text = "2011-06-07T14:08:59.697-07:00";
XMLGregorianCalendar cal = DatatypeFactory.newInstance().newXMLGregorianCalendar(text);
如果您需要java.util.Calendar
,则可以在其上调用toGregorianCalendar()
:
Calendar c2 = cal.toGregorianCalendar();
当然,您可以从中获得java.util.Date
:
Date date = c2.getTime();
您还可以使用本机支持此格式的流行Joda Time库(并且具有比Java标准库更好的处理日期和时间的API)。
答案 1 :(得分:3)
Java SimpleDateFormat 在时区信息中不支持冒号。您应该使用其他实现,例如JodaTime。
使用示例:
String dateString = "2011-06-07T14:08:59.697-07:00";
String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
DateTimeFormatter dtf = DateTimeFormat.forPattern(pattern);
DateTime dateTime = dtf.parseDateTime(dateString);
System.out.println(dateTime);
如果需要,maven pom.xml依赖:
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>1.6.2</version>
</dependency>
希望它有所帮助。
答案 2 :(得分:2)
S
的问题是它会产生三位数毫秒但不会解析三位数。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
System.out.println(sdf.parse("2011-06-07T14:08:59.697-0700"));
打印
Tue Jun 07 22:08:59 BST 2011
您似乎需要删除时区中的:
。
答案 3 :(得分:0)
看起来DateFormat找不到毫秒的结束和时区的开始。 正规救援!
这是一个解决方法:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S Z");
Date date1 = sdf.parse("2011-06-07T14:08:59.697-0700".replaceAll("(?=.{5}$)", " "));
正则表达式放入一个空格,这段代码无错误地执行。