[英]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) {
}
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类来取代麻烦的旧遗留日期时间类。
输入字符串的格式符合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 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的类,比如Interval
, YearWeek
, YearQuarter
,和更多 。
对于像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");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.