Java 无法解析的日期:ms 值中的字符数不同
Java Unparseable date: different number of characters in ms value
我有一个工作流程,我需要将日期值作为输入,对其进行编辑并以准确的格式传递给输出。
为了管理这个任务,我使用这个:
TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
df.setTimeZone(tz);
long date = df.parse(inputDate).getTime() + 1;
outputDate = df.format(date).toString();
大多数时候这段代码工作得很好。但是,有时我会得到这样的输入日期:
2016-05-25T22:00:10.6Z
请注意 ms 的字符数,它是 1 而不是 3。
在上述情况下,我得到异常:
java.text.ParseException: Unparseable date: "2016-05-25T22:00:10.6Z"
at java.text.DateFormat.parse(DateFormat.java:366)
我无法影响输入日期,但我需要 ms 部分中的三个数字。我如何获得它?
您可以捕获 ParseException 并使用以下方法解析日期:
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SXXX");
示例:
public static void main(String[] args) throws ParseException {
TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SXXX");
df.setTimeZone(tz);
df2.setTimeZone(tz);
long date;
String dateToParse = "2016-05-25T22:00:10.6Z";
try {
date = df.parse(dateToParse).getTime() + 1;
}catch (ParseException e){
System.out.println("exception");
date = df2.parse(dateToParse).getTime() + 1;
}
System.out.println(df.format(date));
}
对于解析,实际上你可以像这样只指定一个字母(对于每个字段):
DateFormat df = new SimpleDateFormat("y-M-d'T'H:m:s.SX");
// "2016-5-25T22:0:10.6Z" input is acceptable
// "2016-05-25T22:00:10.6Z" input is acceptable
// "2016-05-25T22:00:10.678Z" input is NOT acceptable
它在解析时接受一个以上的数字(对于每个字段);这意味着模式字母的数量对于解析并不重要(但对于格式化却很重要)。因此,上面的模式可以接受像 "2016-05-25T22:00:10.6Z"
这样的输入。
但是,似乎 Java 8 中存在一些实现问题(我不完全知道)或者可能有一些未记录的内容,因此模式中的连续毫秒和时区(例如。SX
或 SSSX
) 不是 那么简单。我的意思是 "2016-05-25T22:00:10.678Z"
不被上面的模式接受,而不连续的一个是可以接受的,像这样:
DateFormat df = new SimpleDateFormat("y-M-d'T'H:m:s.S X"); // notice the space
// "2016-5-25T22:0:10.6 Z" input is acceptable
// "2016-05-25T22:00:10.6 Z" input is acceptable
// "2016-05-25T22:00:10.678 Z" input is acceptable
解决方法是,如果您的输入具有连续的毫秒和时区(之间没有 space),请创建多个 DateFormat
并捕获异常。
DateFormat df1 = new SimpleDateFormat("y-M-d'T'H:m:s.SX");
DateFormat df2 = new SimpleDateFormat("y-M-d'T'H:m:s.SSX");
DateFormat df3 = new SimpleDateFormat("y-M-d'T'H:m:s.SSSX");
try {
result = df1.parse(inputDate); // first attempt
} catch (ParseException e1) {
try {
result = df2.parse(inputDate); // second attempt
} catch (ParseException e2) {
result = df3.parse(inputDate); // last attempt, dead if fails
}
}
是的,这个解决方法是一种污垢 :D.
我有一个工作流程,我需要将日期值作为输入,对其进行编辑并以准确的格式传递给输出。 为了管理这个任务,我使用这个:
TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
df.setTimeZone(tz);
long date = df.parse(inputDate).getTime() + 1;
outputDate = df.format(date).toString();
大多数时候这段代码工作得很好。但是,有时我会得到这样的输入日期:
2016-05-25T22:00:10.6Z
请注意 ms 的字符数,它是 1 而不是 3。
在上述情况下,我得到异常:
java.text.ParseException: Unparseable date: "2016-05-25T22:00:10.6Z"
at java.text.DateFormat.parse(DateFormat.java:366)
我无法影响输入日期,但我需要 ms 部分中的三个数字。我如何获得它?
您可以捕获 ParseException 并使用以下方法解析日期:
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SXXX");
示例:
public static void main(String[] args) throws ParseException {
TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SXXX");
df.setTimeZone(tz);
df2.setTimeZone(tz);
long date;
String dateToParse = "2016-05-25T22:00:10.6Z";
try {
date = df.parse(dateToParse).getTime() + 1;
}catch (ParseException e){
System.out.println("exception");
date = df2.parse(dateToParse).getTime() + 1;
}
System.out.println(df.format(date));
}
对于解析,实际上你可以像这样只指定一个字母(对于每个字段):
DateFormat df = new SimpleDateFormat("y-M-d'T'H:m:s.SX");
// "2016-5-25T22:0:10.6Z" input is acceptable
// "2016-05-25T22:00:10.6Z" input is acceptable
// "2016-05-25T22:00:10.678Z" input is NOT acceptable
它在解析时接受一个以上的数字(对于每个字段);这意味着模式字母的数量对于解析并不重要(但对于格式化却很重要)。因此,上面的模式可以接受像 "2016-05-25T22:00:10.6Z"
这样的输入。
但是,似乎 Java 8 中存在一些实现问题(我不完全知道)或者可能有一些未记录的内容,因此模式中的连续毫秒和时区(例如。SX
或 SSSX
) 不是 那么简单。我的意思是 "2016-05-25T22:00:10.678Z"
不被上面的模式接受,而不连续的一个是可以接受的,像这样:
DateFormat df = new SimpleDateFormat("y-M-d'T'H:m:s.S X"); // notice the space
// "2016-5-25T22:0:10.6 Z" input is acceptable
// "2016-05-25T22:00:10.6 Z" input is acceptable
// "2016-05-25T22:00:10.678 Z" input is acceptable
解决方法是,如果您的输入具有连续的毫秒和时区(之间没有 space),请创建多个 DateFormat
并捕获异常。
DateFormat df1 = new SimpleDateFormat("y-M-d'T'H:m:s.SX");
DateFormat df2 = new SimpleDateFormat("y-M-d'T'H:m:s.SSX");
DateFormat df3 = new SimpleDateFormat("y-M-d'T'H:m:s.SSSX");
try {
result = df1.parse(inputDate); // first attempt
} catch (ParseException e1) {
try {
result = df2.parse(inputDate); // second attempt
} catch (ParseException e2) {
result = df3.parse(inputDate); // last attempt, dead if fails
}
}
是的,这个解决方法是一种污垢 :D.