繁体   English   中英

SimpleDateFormat“Unparseable date”异常

[英]SimpleDateFormat “Unparseable date” Exception

我试图用SimpleDateFormat.parse()解析日期时间字符串,但我一直收到Unparseable日期异常。

这是我要解析的日期格式: 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());
}

返回此错误: java.text.ParseException: Unparseable date: "2011-10-06T12:00:00-08:00"

据我所知,这是使用SimpleDateFormat类的正确方法,但我不能流利使用Java,所以我可能会弄错。 谁知道我的问题是什么?

时区应该是GMT-08:00或-0800(正如Madcore Tom所说)。 请参阅Java文档

在Java 7中,您可以使用“yyyy-MM-dd'T'HH:mm:ssX”

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

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

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

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

之后,创建所需格式化的格式化。 例如: 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) {

}

TL;博士

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

2011年10月6日

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 );

输出:2011年10月6日

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

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

2011-10-06


关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多

对于像2013-06-28T00:00:00+00:00这样的日期格式,此代码应该有效:

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

我相信大多数人都对SimpleDateFormat无法处理ISO8601格式这一事实感到沮丧。 这是解决这种麻烦的小技巧。

创建一个知道格式的列表,您知道将用于您的应用程序并将SimpleDateFormat应用于列表。 现在,在你的formatDate()方法中,简单地尝试所有已知的格式并捕获异常,然后如果仍然没有日期,只需使用

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

尝试一下,看看是否有效。 有关更多信息在Java中使用时区转换日期格式的简单技巧!

试试吧

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

我强烈建议使用JodaTime来做这类事情。

您正在尝试解析ISO日期格式,而Joda会“开箱即用”,并且还会为您提供许多其他好处。

我很久以前就放弃了尝试获取标准的JDK数据类来做有用的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM