Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中验证ISO8601日期时间字符串的推荐方法是什么_Java_Date_Time_Datetime Format_Iso8601 - Fatal编程技术网

在java中验证ISO8601日期时间字符串的推荐方法是什么

在java中验证ISO8601日期时间字符串的推荐方法是什么,java,date,time,datetime-format,iso8601,Java,Date,Time,Datetime Format,Iso8601,我正在使用Java11。想知道在java中验证datetime字符串是否为ISO8601的最佳方法(最重要的是推荐的方法) 另外,如何将该字符串值与java.sql.Timestamp进行比较?假设您至少使用java 8,最简单的方法如下: private static boolean isIsoDate(String date) { try { Instant.from(DateTimeFormatter.ISO_INSTANT.parse(date));

我正在使用Java11。想知道在java中验证datetime字符串是否为ISO8601的最佳方法(最重要的是推荐的方法)


另外,如何将该字符串值与java.sql.Timestamp进行比较?

假设您至少使用java 8,最简单的方法如下:

private static boolean isIsoDate(String date) {
    try {
        Instant.from(DateTimeFormatter.ISO_INSTANT.parse(date));
        return true;
    } catch (DateTimeParseException e) {
        //log the failure here
        e.printStackTrace();
    }
    return false;
}
相反,您可以使用
regex
验证格式,但这比上述方法要困难得多

至于您的另一个问题,最简单的方法是首先将日期字符串转换为具体的
date
对象,然后按照此处的建议操作:


假设您至少在使用Java 8,最简单的方法如下:

private static boolean isIsoDate(String date) {
    try {
        Instant.from(DateTimeFormatter.ISO_INSTANT.parse(date));
        return true;
    } catch (DateTimeParseException e) {
        //log the failure here
        e.printStackTrace();
    }
    return false;
}
相反,您可以使用
regex
验证格式,但这比上述方法要困难得多

至于您的另一个问题,最简单的方法是首先将日期字符串转换为具体的
date
对象,然后按照此处的建议操作:


假设您至少在使用Java 8,最简单的方法如下:

private static boolean isIsoDate(String date) {
    try {
        Instant.from(DateTimeFormatter.ISO_INSTANT.parse(date));
        return true;
    } catch (DateTimeParseException e) {
        //log the failure here
        e.printStackTrace();
    }
    return false;
}
相反,您可以使用
regex
验证格式,但这比上述方法要困难得多

至于您的另一个问题,最简单的方法是首先将日期字符串转换为具体的
date
对象,然后按照此处的建议操作:


假设您至少在使用Java 8,最简单的方法如下:

private static boolean isIsoDate(String date) {
    try {
        Instant.from(DateTimeFormatter.ISO_INSTANT.parse(date));
        return true;
    } catch (DateTimeParseException e) {
        //log the failure here
        e.printStackTrace();
    }
    return false;
}
相反,您可以使用
regex
验证格式,但这比上述方法要困难得多

至于您的另一个问题,最简单的方法是首先将日期字符串转换为具体的
date
对象,然后按照此处的建议操作:


以后从java 8中可以使用
DateTimeFormatter
类来检查格式,因此我定义了一个方法来检查其是否为ISO格式:

boolean isValidISODateTime(String date) {
    try {
        java.time.format.DateTimeFormatter.ISO_DATE_TIME.parse(date);
        return true;
    } catch (java.time.format.DateTimeParseException e) {
        return false;
    }
}

在以后的java 8中,您可以使用
DateTimeFormatter
类来检查格式,因此我定义了一个方法来检查其是否为ISO格式:

boolean isValidISODateTime(String date) {
    try {
        java.time.format.DateTimeFormatter.ISO_DATE_TIME.parse(date);
        return true;
    } catch (java.time.format.DateTimeParseException e) {
        return false;
    }
}

在以后的java 8中,您可以使用
DateTimeFormatter
类来检查格式,因此我定义了一个方法来检查其是否为ISO格式:

boolean isValidISODateTime(String date) {
    try {
        java.time.format.DateTimeFormatter.ISO_DATE_TIME.parse(date);
        return true;
    } catch (java.time.format.DateTimeParseException e) {
        return false;
    }
}

在以后的java 8中,您可以使用
DateTimeFormatter
类来检查格式,因此我定义了一个方法来检查其是否为ISO格式:

boolean isValidISODateTime(String date) {
    try {
        java.time.format.DateTimeFormatter.ISO_DATE_TIME.parse(date);
        return true;
    } catch (java.time.format.DateTimeParseException e) {
        return false;
    }
}
事情太多了,所以我不打算写一个详尽的答案。我试图概述一下您可能会选择的选项。之后,你应该进一步研究相关的问题。在这样做之前,你可能需要研究什么是ISO8601,它有时是什么,有时不是什么

对于许多(大多数)目的来说,尝试使用内置的java.time(现代java日期和时间API)解析字符串将为您提供令人满意的验证,正如其他答案中所述。选项包括:

  • 更简单、更经常:使用java.time中相应日期时间类的one-arg
    parse
    方法。它们通常解析ISO 8601格式,如果字符串不是ISO 8601格式,则抛出
    DateTimeParseException
    。根据字符串中需要显示的信息(日期和/或时间,UTC偏移量),例如,您可以使用
    OffsetDateTime.parse()
    LocalDate.parse()
  • 对于特殊或特殊需求,请使用
    DateTimeFormatter
    类的
    ISO_XXXX
    常量之一
至少有三种方式不足以满足您的上述要求:

  • 构建它意味着解析和接受最常见的ISO 8601变体。例如,
    OffsetDateTime.parse(CharSequence)
    要求在UTC的偏移量中使用冒号(如果不是
    Z
    ),如
    +07:00
    所示。ISO 8601还允许在不使用冒号的情况下写入偏移量,如
    +0700
    中所示。如果您需要适应内置方法未涵盖的变体,那么构建您自己的
    DateTimeFormatter
    可能是一个不错且不太复杂的解决方案。您可以使用模式的
    DateTimeForamtter.ofPattern
    方法或
    DateTimeFormatterBuilder
  • 内置的方法有时允许您可能不希望允许的值。例如,在严格的ISO 8601中,一年介于1583和9999之间(含1583和9999)。java.time的类允许从-999年到+999年的时间。您的解决方案是解析后的范围检查。日期时间类有方法
    isBefore
    isAfter
  • ISO 8601包括java.time不提供类或格式化程序的时间间隔,包括重复时间间隔。如果你想允许这些,你可以寻找一个不同的日期和时间库(想到Time4J和ThreeTen Extra),或者你必须自己做更多的工作来验证
  • 如何与java.sql.Timestamp进行比较? 如果你可以避免使用,就这样做。那门课设计得很糟糕,而且早已过时。因为我们更喜欢从数据库中获取时间戳

    如果您从旧式API获得了一个
    时间戳
    ,而您现在无法升级,请将每个API转换为,并使用或进行比较。下面是一个例子:

        String yourIso8601String = "2020-11-17T02:51:39.375109+07:00";
        Timestamp ts = Timestamp.from(Instant.parse("2020-11-16T19:00:00Z"));
        
        OffsetDateTime odt = OffsetDateTime.parse(yourIso8601String);
        boolean isBeforeTimestamp = odt.toInstant().isBefore(ts.toInstant());
        System.out.println("Is the ISO 8601 string before the Timestamp? " + isBeforeTimestamp);
    
    示例的输出为:

    ISO 8601字符串是否在时间戳之前?假的

    链接
    • 解释如何使用java.time
      • 有很多东西,所以我不打算写一个详尽的答案。我试图概述一下您可能会选择的选项。之后,你应该进一步研究相关的问题。也许在你这么做之前