Java不可解析日期:ms值中的字符数不同

Java不可解析日期:ms值中的字符数不同,java,date-format,Java,Date Format,我有一个工作流,我需要将日期值作为输入,编辑它并以精确的格式传递到输出。 为了管理此任务,我使用以下方法: 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

我有一个工作流,我需要将日期值作为输入,编辑它并以精确的格式传递到输出。 为了管理此任务,我使用以下方法:

 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 
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
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
请注意ms的字符数,它是1而不是3

在上述情况下,我会得到一个例外:

java.text.ParseException: Unparseable date: "2016-05-25T22:00:10.6Z"
            at java.text.DateFormat.parse(DateFormat.java:366)

我没有办法影响输入日期,但我需要ms part中正好有三个数字。我如何获得它

您可以捕获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));
}

您可以使用以下方法捕获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));
}

对于解析,实际上只能指定一个字母(对于每个字段),如下所示:

2016-05-25T22:00:10.6Z 
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
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
它在解析时接受多个数字(每个字段);这意味着模式字母的数量对于解析来说并不重要(但对于格式化来说很重要)。因此,对于上述模式,类似于
“2016-05-25T22:00:10.6Z”
的输入是可以接受的

然而,Java 8中似乎存在一些实现问题(我不太清楚),或者可能有一些东西没有被记录下来,所以模式中的连续毫秒和时区(例如,
SX
SSSX
)并不是那么简单。我的意思是,
“2016-05-25T22:00:10.678Z”
不被上述模式接受,而非连续模式是可以接受的,如下所示:

2016-05-25T22:00:10.6Z 
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
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
解决方法是,如果您的输入具有连续的毫秒和时区(两者之间没有空格),则创建多个
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.

对于解析,实际上您只能指定一个字母(对于每个字段),如下所示:

2016-05-25T22:00:10.6Z 
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
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
它在解析时接受多个数字(每个字段);这意味着模式字母的数量对于解析来说并不重要(但对于格式化来说很重要)。因此,对于上述模式,类似于
“2016-05-25T22:00:10.6Z”
的输入是可以接受的

然而,Java 8中似乎存在一些实现问题(我不太清楚),或者可能有一些东西没有被记录下来,所以模式中的连续毫秒和时区(例如,
SX
SSSX
)并不是那么简单。我的意思是,
“2016-05-25T22:00:10.678Z”
不被上述模式接受,而非连续模式是可以接受的,如下所示:

2016-05-25T22:00:10.6Z 
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
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
解决方法是,如果您的输入具有连续的毫秒和时区(两者之间没有空格),则创建多个
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