我正在尝试使用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,所以我可能会弄错。谁知道我的问题是什么?
答案 0 :(得分:13)
时区应该是GMT-08:00或-0800(正如Madcore Tom所说)。请参阅Java docs。
在Java 7中你可以使用“yyyy-MM-dd'T'HH:mm:ssX”
答案 1 :(得分:11)
我相信SimpleDateFormat不会解析带有冒号的时区(-08:00)。它应该能够解析日期2011-10-06T12:00:00-0800
。
一些简单的字符串操作应该可以帮助你摆脱冒号。
答案 2 :(得分:1)
首先需要格式化"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) {
}
答案 3 :(得分:1)
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及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 4 :(得分:0)
尝试
SimpleDateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz");
答案 5 :(得分:0)
对于2013-06-28T00:00:00+00:00
这样的日期格式,此代码应该有效:
SimpleDateFormat sdfSource = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
答案 6 :(得分:0)
我相信大多数人都对SimpleDateFormat无法处理ISO8601格式这一事实感到沮丧。这是解决这种麻烦的小技巧。
创建一个知道格式的列表,您知道将用于您的应用程序并将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!
答案 7 :(得分:-1)