为什么我在下面收到错误?它只发生在一些日期。
Helper.getDate("2014-01-09T17:10:14Z", "dd-MM-yyyy");
public static Date getDate(String date, String format) {
DateFormat df = new SimpleDateFormat(format);
try {
return df.parse(date);
} catch (ParseException e) {
log.error("getDate", e);
}
return null;
}
答案 0 :(得分:4)
这个日期:
"2014-01-09T17:10:14Z"
的格式为
"yyyy-MM-dd'T'HH:mm:ss'Z'"
(或在Java 7中"yyyy-MM-dd'T'HH:mm:ssX"
)
当然,用格式dd-MM-yyyy
解析它是不可能的。
格式化字符串需要与输入兼容!
(注意我给了一个文字Z,这是后向兼容的.Java 7实际上理解ISO8601,你可以使用X来实际解析它。)
答案 1 :(得分:0)
该字符串2014-01-09T17:10:14Z
是日期时间的标准ISO 8601格式。
Joda-Time 2.3库直接在其DateTime
构造函数中使用此类标准字符串。无需格式化程序/解析器。
Easy one liner ...
(将标准字符串提供给DateTime的构造函数,然后将DateTime实例转换为java.util.Date实例)
// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
java.util.Date date = new DateTime( "2014-01-09T17:10:14Z" ).toDate();
转储到控制台,并显示DateTime
值以进行比较......
System.out.println( "date: " + date );
System.out.println( "dateTime: " + new DateTime( "2014-01-09T17:10:14Z" ) );
System.out.println( "dateTime in UTC: " + new DateTime( "2014-01-09T17:10:14Z" ).toDateTime( DateTimeZone.UTC ) );
跑步时......
date: Thu Jan 09 09:10:14 PST 2014
dateTime: 2014-01-09T09:10:14.000-08:00
dateTime in UTC: 2014-01-09T17:10:14.000Z
答案 2 :(得分:0)
已经有很多答案,但只是想用 java 8 进行更新。
一般来说,我们面临两个日期问题
DateTimeFormatter
类可用于这两个目的。
下面的方法试图为这些问题提供解决方案。
方法1:
将您的UTC字符串转换为即时。使用即时,您可以通过提供时区字符串为所有时区创建日期,并使用DateTimeFormatter
格式化日期以供显示。
String dateString = "2016-07-13T18:08:50.118Z";
String tz = "America/Mexico_City";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MMM d yyyy hh:mm a");
ZoneId zoneId = ZoneId.of(tz);
Instant instant = Instant.parse(dateString);
ZonedDateTime dateTimeInTz =ZonedDateTime.ofInstant(instant, zoneId);
System.out.println(dateTimeInTz.format(dtf));
方法2:
使用DateTimeFormatter
内置常量(例如ISO_INSTANT
)将字符串解析为LocalDate
。
ISO_INSTANT
可以解析模式的日期
yyyy-MM-dd' H&H:mm:ssX 例如' 2011-12-03T10:15:30Z'
LocalDate parsedDate
= LocalDate.parse(dateString, DateTimeFormatter.ISO_INSTANT);
DateTimeFormatter displayFormatter = DateTimeFormatter.ofPattern("yyyy MM dd");
System.out.println(parsedDate.format(displayFormatter));
方法3:
如果您的日期字符串具有很高的时间精度,例如它可以捕获几分之一秒,并且在这种情况下 2016-07-13T18:08:50.118Z 那么方法1将起作用,但方法2将不行。如果你试图解析它将抛出DateTimeException
,因为ISO_INSTANT
格式化程序将无法解析从其模式中看到的秒数。
在这种情况下,您必须通过提供如下日期模式来创建自定义 DateTimeFormatter
。
LocalDate localDate
= LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX"));