有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中的日期分析异常

我试图验证一个字符串是否在ISO-8601日期内,但它抛出了一个解析异常,不确定哪里出错

try {
    String s = "2007-03-01T13:00:00Z";
    SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
    ft.setLenient(false);
    System.out.println(ft.format(ft.parse(s)));
} catch (ParseException e) {
    System.out.println(e.getMessage());
}

输出为:

Unparseable date: "2007-03-01T10:00:00Z"

共 (5) 个答案

  1. # 1 楼答案

    您的代码不起作用,因为SDF非常有限,并且在编写时不知道ISO 8601

    您可以使用以下代码:

    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.apache.commons.lang.time.DateUtils;
    
    public final class JSONDateUtil {
    
        private static final DateFormat ISO8601_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
    
        static  {
            ISO8601_FORMAT.setLenient(false);
            ISO8601_FORMAT.setTimeZone(DateUtils.UTC_TIME_ZONE);
        }
    
        public static String toJSON(Date date) {
            return ISO8601_FORMAT.format(date);
        }
    
        public static String toJSON(long millis) {
            return ISO8601_FORMAT.format(millis);
        }
    
        public static Date toJava(String date) {
            try {
                return ISO8601_FORMAT.parse(date);
            } catch (ParseException e) {
                return null;
            }
        }
    
    }
    

    注意时区,这非常重要

  2. # 2 楼答案

    如果您使用的是Java 7,请使用以下格式字符串:"yyyy-MM-dd'T'HH:mm:ssXXX"

    注意:X是一个新代码(在Java7中添加),与ISO8601时区字符串匹配;请参阅^{}的API文档

  3. # 3 楼答案

    我怀疑Z被解释为一个时区,因此将匹配-0800,而不是字面上的Z,因此您可以通过引用:'Z'来解决这个问题

    ^{}应该告诉你问题出在哪里

  4. # 4 楼答案

    乔达时间

    仅供参考,如果您使用Joda-Time而不是臭名昭著的麻烦java。util。在Date/Calendar类中,您可以简单地将ISO 8601字符串直接传递到DateTime构造函数中,而无需格式化程序。Joda Time使用ISO 8601作为其默认值

    DateTimeZone timeZone = DateTimeZone.forID( "America/Montreal" );
    DateTime dateTime = new DateTime( "2007-03-01T13:00:00Z", timeZone );
    

    验证

    要确定输入字符串是否无效,请捕获^{}

    爪哇。util。日期

    你甚至可以得到一个java。util。如果需要,请注明日期

    java.util.Date date = dateTime.toDate();
    
  5. # 5 楼答案

    如果要验证任意字符串,则不能硬编码“Z”时区指示符,因为有效的ISO8601时间戳(如“2007-03-01T13:00:00+01”)的验证将失败

    如果您使用的是Java 6或更早版本,SimpleDataFormat将不支持ISO8601时区编码,因此您也不能使用它来验证时间戳。对于Java7或更高版本,您可以使用new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");