2011-10-06 109 views
5

我想解析日期时间字符串与SimpleDateFormat.parse(),但我不断收到Unparseable日期异常。SimpleDateFormat“无法解析的日期”异常

这里的日期格式我试图解析:2011-10-06T12:00:00-08:00

这里是我使用的代码:据我所知java.text.ParseException: Unparseable date: "2011-10-06T12:00:00-08:00"

:它返回该错误

try { 
    String dateStr = "2011-10-06T12:00:00-08:00"; 
    SimpleDateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); 
    SimpleDateFormat dateFormatter = new SimpleDateFormat("MMM d, yyyy"); 
    Date date = dateParser.parse(dateStr); 
    System.out.println(dateFormatter.format(date));   
} catch(Exception e) { 
    System.out.println(e.getMessage()); 
} 

这是使用SimpleDateFormat类的正确方法,但我在Java中不流利,所以我可能会误解。任何人都知道我的问题是什么?

回答

10

时区应该是GMT-08:00或者-0800(正如Madcore Tom所说)。见Java docs

在Java 7,您可以使用 “YYYY-MM-dd'T'HH:MM:SSX”

+1

'X'选项是我一直在寻找的。我正在阅读Java 6文档。谢谢 – Wade

+0

对于其他的,非java7,你可以尝试使用'javax.xml.bind.DatatypeConverter.parseDateTime(date)',更多的信息可以在这里找到这个博客http://ta.cnci.org/java -blogs/236-convert-date –

0

尝试用

SimpleDateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz"); 
+0

我收到了相同的结果 – Wade

+0

这对我来说可以解析,你在做什么环境? – Rob

+0

Windows 7机器上的Java 7 – Wade

10

相信的SimpleDateFormat不会与他们冒号(-08:00)解析时区。它应该能够解析日期2011-10-06T12:00:00-0800

一些简单的字符串操作应该可以帮助您摆脱冒号。

+0

是的,似乎是这个问题。谢谢你的帮助。 – Wade

-1

我强烈建议使用JodaTime对于这样的事情。

你试图解析一个ISO日期格式,而Joda做的是'开箱即用',并且也会给你很多其他的好处。

我很久以前就放弃了试图让标准JDK数据类做有用的事情。

+1

我想介绍一些如何使用JODA时间来解决这个解析问题的例子吗? – Saurabh

+0

那些“很多”好处是?除此之外,它还会引入异常情况,试图在夏令时发生时解析日期。 –

+0

仅供参考,[Joda-Time](http://www.joda.org/joda-time/)项目现在处于[维护模式](https://en.wikipedia.org/wiki/Maintenance_mode),该团队建议迁移到[java.time](http://docs.oracle.com/javase/9​​/docs/api/java/time/package-summary.html)类。请参见[Oracle教程](https://docs.oracle.com/javase/tutorial/datetime/TOC.html)。 –

0

对于像2013-06-28T00:00:00+00:00日期格式,此代码应工作:

SimpleDateFormat sdfSource = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
0

我相信你们大多数人都得到了一个事实,即SimpleDateFormat的无法处理的ISO8601格式受挫。这是我解决这个麻烦的小技巧。

创建Know格式列表,您知道您将用于您的应用程序并将SimpleDateFormat应用于列表。现在,在formatDate()方法,简单的尝试所有已知的格式和陷阱的例外,那么,如果仍然没有一个日期,只需使用

Date d = javax.xml.bind.DatatypeConverter.parseDateTime("2013-06-28T00:00:00+00:00").getTime(); 
if (d == null) 
try { 
    SimpleDateFormater ... 
} 

尝试一下,看看是否工作。欲了解更多信息Simple trick to convert Date format with timezone in Java!

1

您首先需要格式化值在"2011-10-06T12: 00: 00-08: 00"

Example: SimpleDateFormat dateParser = new SimpleDateFormat ("yyyy-MM-dd'T'HH: mm: ssZ"); 

之后,创建所需的formataction formating。 例如:SimpleDateFormat fmt = new SimpleDateFormat ("dd/MM/yyyy HH: mm: ss");

和之后进行解析日期。 例如:Date date = dateParser.parse (dateFormat); 和日期格式打印。

下面是一个完整的例子。

String dataStr = "2011-10-06T12: 00: 00-08: 00"; 
SimpleDateFormat dataParser = new SimpleDateFormat ("dd/MM/yyyy HH: mm: ss", Locale.US); 
Date date; 
Try { 
date = dataParser.parse (dataStr); 
System.out.println (dateFormatter.format (date)); 

} cath (ParseException e) { 

} 
1

TL;博士

OffsetDateTime.parse("2011-10-06T12:00:00-08:00") 
    .format( 
     DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.US) // Or Locale.CANADA_FRENCH and such. 
    ) 

Oct 6, 2011

java.time

现代的方法使用java.time类,取代了麻烦的旧的遗留日期时间类。

您输入的字符串格式符合ISO 8106标准。在解析/生成字符串时,java.time类默认使用这些标准格式。所以不需要指定格式化模式。

解析为OffsetDateTime,因为您的输入字符串包含UTC的偏移量,但不包含时区。

OffsetDateTime odt = OffsetDateTime.parse("2011-10-06T12:00:00-08:00") ; 

odt.toString(): 2011-10-06T12:00-08:00

生成你想要的格式的字符串。让java.time自动本地化而不是硬编码格式化模式。

DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.US); // Or Locale.CANADA_FRENCH and such. 
String output = odt.format(f); 

output: Oct 6, 2011

当seralizing日期时间值作为文本,使用标准的ISO 8601种,而不是格式本地化的格式。

String output = odt.toLocalDate().toString() ; 

2011-10-06


关于java.time

java.time框架是建立在Java 8和更高版本。这些类代替了日期时间类legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time项目,现在在maintenance mode,建议迁移到java.time类。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310

从何处获取java.time类?

ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如Interval,YearWeek,YearQuartermore

相关问题