java.lang.IllegalArgumentException:解析错误:无法解析日期格式

时间:2016-01-19 02:41:45

标签: java android date

我需要格式化以下日期fomat

 timeBooked: "2015-05-20T02:08:00.000Z",
 ExpiryTime: "2015-05-20T04:08:00.000Z",

我的代码遵循格式化日期:

try {
     Date currentDate = new Date(timeBooked);
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.ZZ", Locale.ENGLISH);
     Log.e(TAG, "formatted time string: " + sdf.format(currentDate.getTime()));

     Log.e(TAG, "date string:=" + currentDate.getDate());
} catch (Exception e) {
         Log.e(TAG, e.getMessage());
         e.printStackTrace();
}

运行此代码时, java.lang.IllegalArgumentException:Parse error:2015-05-20T02:08:00.000Z

3 个答案:

答案 0 :(得分:1)

您的格式字符串不正确。它应该是"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"

然后,为了正确得到您的日期,您应该使用:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ENGLISH);
// Set time zone to UTC since 'Z' at end of String specifies it.
sdf.setTimeZone(TimeZone.getTimeZone("UTC")); 
// The parsed date will be offset from UTC in device's current TimeZone.
Date currentDate = sdf.parse(timeBooked);

答案 1 :(得分:0)

不建议使用带有字符串的Date构造函数:请参阅http://developer.android.com/reference/java/util/Date.html#Date(java.lang.String)。它不接受自定义日期格式;只允许一组预定义的格式。

一旦你的DateFormat字符串正确(我认为“yyyy-MM-dd'T'HH:mm:ss.SSS'Z'”应该有效)你可以调用sdf.parse(timeBooked)来获得一个有效的日期

答案 2 :(得分:0)

Z有意义

以前的两个Answers都告诉你期望 - 并忽略Z字符,在编码的解析模式中用单引号括起来。 糟糕的建议。您会忽略有价值的数据,并拒绝有效的替代输入,例如2015-05-20T02:08:00.000+05:30。模式代码Z表示“任何有效offset-from-UTC”。添加'Z'的单引号说“期望在这里出现大写的Z,忽略它可能具有的任何含义,并且如果Z缺失则抛出异常”。

约达时间

您正在使用与早期Java版本捆绑在一起的旧日期时间类。这些类已被证明是麻烦的,在设计和实现方面都存在缺陷。避免他们。在当前的Android中,将Joda-Time库添加到项目中。在Java 8及更高版本中,使用受Joda-Time启发的java.time框架。

您的字符串输入采用ISO 8601标准格式。在解析/生成日期时间值的文本表示时,Joda-Time和java.time都使用ISO 8601作为其默认值。因此,这些类可以直接解析这些字符串,而无需指定任何编码的解析模式。

以下代码创建一个日期时间,该日期时间指定了一个从0开始的偏移量,这是Z(对于Zulu)的含义。

DateTime dateTime = DateTime.parse( "2015-05-20T02:08:00.000Z" );

使用构造函数具有不同的含义。以下代码使用零偏移量解析值,但随后将结果调整为JVM的当前默认时区。

DateTime dateTime = new DateTime( "2015-05-20T02:08:00.000Z" ) );

我建议您始终明确指定所需/预期的时区。

DateTimeZone zone = DateTimezone.forID( "Europe/Paris" );
DateTime dateTime_Europe_Paris = dateTime.withZone( zone );

如果你真的需要java.util.Date,请在使用Joda-Time进行解析和业务逻辑后进行转换。

java.util.Date date = dateTime.toDate();

使用示例代码为Joda-Time搜索StackOverflow以获取许多更多问题和答案。

相关问题