[英]java.text.ParseException: Unparseable date: Getting Parse Exception
[英]java.text.Parse Exception : Unparseable Date
我有以下代码:
String ModifiedDate = "1993-06-08T18:27:02.000Z" ;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
Date ModDate = sdf.parse(ModifiedDate);
即使我的日期格式很好,我也会收到以下异常...
java.text.ParseException: Unparseable date: "1993-06-08T18:27:02.000Z"
at java.text.DateFormat.parse(DateFormat.java:337)
Z
模式后者表示RFC 822时区。 你的字符串
String ModifiedDate = "1993-06-08T18:27:02.000Z" ;
不包含这样的时区。 它字面上包含一个Z
你需要一个日期模式,与文字T
类似,有一个文字Z
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
如果你想让Z
表示Zulu时间,那么在构造SimpleDateFormat
时将其添加为时区
sdf.setTimeZone(TimeZone.getTimeZone("Zulu"));;
Sotirios Delimanolis的答案是正确的。 Z
表示祖鲁时间,与UTC(+00:00)的零偏移。 换句话说,没有调整到任何时区。
仅供参考, Joda-Time库使得这项工作变得更加容易, Java 8中的新java.time包也是如此。
您使用的格式由ISO 8601标准定义。 Joda-Time和java.time默认情况下解析并生成ISO 8601字符串。
Joda-Time中的DateTime知道自己指定的时区。 因此,作为解析过程的一部分,请指定要调整的时区。
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime dateTime = new DateTime( "1993-06-08T18:27:02.000Z", timeZone );
String output = dateTime.toString();
如果需要,可以将DateTime对象保留在Universal Time中 。
DateTime dateTime = new DateTime( "1993-06-08T18:27:02.000Z", DateTimeZone.UTC );
当其他类需要时,您可以生成java.util.Date对象。
java.util.Date date = dateTime.toDate();
现代日期时间 API于 2014 年 3 月与 Java-8 一起发布,取代了旧日期时间 API( java.util
日期时间 API 及其格式SimpleDateFormat
)。 从那时起,强烈建议停止使用容易出错的遗留 API 并切换到java.time
API。
使用java.time
API 的解决方案: java.time
API 基于ISO 8601 ,因此您不需要DateTimeFormatter
来解析已经采用 ISO 8601 格式的日期时间字符串(例如,您的日期时间字符串, 1993-06-08T18:27:02.000Z
)。
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZonedDateTime;
class Main {
public static void main(String[] args) {
String strModifiedDate = "1993-06-08T18:27:02.000Z";
Instant instant = Instant.parse(strModifiedDate);
System.out.println(instant);
// It can also be directly parsed into a ZonedDateTime
ZonedDateTime zdt = ZonedDateTime.parse(strModifiedDate);
System.out.println(zdt);
// or even into an OffsetDateTime
OffsetDateTime odt = OffsetDateTime.parse(strModifiedDate);
System.out.println(odt);
}
}
Output :
1993-06-08T18:27:02Z
1993-06-08T18:27:02Z
1993-06-08T18:27:02Z
如果出于任何原因,您需要java.util.Date
实例,您可以通过以下方式获取它:
Date date = Date.from(instant);
从Trail:Date Time了解有关现代日期时间 API 的更多信息。
这是使用遗留日期时间 API 的解决方案。首先,请注意'Z' 与 Z 不同。 'Z'
只是一个字符文字,而Z
是零时区偏移量(或 UTC)的时区指示符。 因此,永远不要在日期时间格式/解析模式中使用'Z'
; 否则,它将仅被解释为文字字符,而不是时区指示符。
时区偏移量模式中使用的正确字母是X
。
演示:
class Main {
public static void main(String[] args) throws ParseException {
String strModifiedDate = "1993-06-08T18:27:02.000Z";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
Date modifiedDate = sdf.parse(strModifiedDate);
System.out.println(modifiedDate);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.