1

我正在尝试验证一个字符串是否在 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"
4

5 回答 5

4

我怀疑这Z被解释为时区所以会匹配-0800但不是文字Z所以你可以通过引用来解决这个问题:'Z'

getErrorOffset应该告诉你问题出在哪里。

于 2012-10-29T14:58:03.757 回答
2

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

注意:X是匹配 ISO 8601 时区字符串的新代码(在 Java 7 中添加);请参阅 的 API 文档SimpleDateFormat

于 2012-10-29T15:21:54.817 回答
1

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

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

于 2012-10-29T15:19:18.357 回答
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;
        }
    }

}

注意时区,非常重要。

于 2012-10-29T15:00:16.563 回答
0

乔达时间

仅供参考,如果您使用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 );

验证

要确定您的输入字符串是否无效,请 catch IllegalArgumentException

java.util.日期

如果需要,您甚至可以返回 java.util.Date。

java.util.Date date = dateTime.toDate();
于 2014-02-19T08:07:40.203 回答