带时区的无法解析的日期

时间:2016-02-01 13:58:57

标签: java date timezone simpledateformat parseexception

我必须解析这两个日期

private static final String d1 = "2013­-04­-02T08:37:56Z";
private static final String d2 = "2013-­04-­02T10:37:56+02:00";

第一个使用模式

"yyyy-MM-dd'T'HH:mm:ss'Z'"

对于第二个我正在使用

"yyyy-MM-dd'T'HH:mm:ssXXX"

但我总是得到

java.text.ParseException: Unparseable date: ....

这是我的测试代码:

private static final String d1 = "2013-­04­-02T08:37:56Z";
private static final String d2 = "2013-­04­-02T10:37:56+02:00";

private static final String DATE_FORMAT_WITH_TIMEZONE = "yyyy-MM-dd'T'HH:mm:ss'Z'";
private static final String DATE_FORMAT_WITH_TIMEZONE2 = "yyyy-MM-dd'T'HH:mm:ssXXX";

public static void main(String[] args) {
    try {
        SimpleDateFormat df = new SimpleDateFormat(DATE_FORMAT_WITH_TIMEZONE);

        Date d = df.parse(d1);
        System.out.println("d1 = " + d);

        df = new SimpleDateFormat(DATE_FORMAT_WITH_TIMEZONE2);
        df.setTimeZone(TimeZone.getTimeZone("Europe/Rome"));
        Date dt = df.parse(d2);
        System.out.println("d2 = " + dt);
    } catch (ParseException ex) {
        ex.printStackTrace();
    }
}

我的代码有什么问题?

3 个答案:

答案 0 :(得分:3)

您的DateFormat定义错误:

private static final String DATE_FORMAT_WITH_TIMEZONE = "yyyyMMdd'T'HH:mm:ss'Z'";
private static final String DATE_FORMAT_WITH_TIMEZONE2 = "yyyyMMdd'T'HH:mm:ssXXX";

字符串中没有减号

<强>更新: 在您更新问题后,我认为-符号不是减号。它看起来如此。替换这个标志。然后再试一次。

答案 1 :(得分:0)

按如下方式更改Formatter

private static final String DATE_FORMAT_WITH_TIMEZONE = "yyyyMMdd'T'HH:mm:ss'Z'";
private static final String DATE_FORMAT_WITH_TIMEZONE2 = "yyyyMMdd'T'HH:mm:ssXXX";

但是,为了这个目的,我建议使用JodaTime。 JodaTime功能更强大。使用JodaTime,您可以执行以下操作:

DateTimeFormatter df = DateTimeFormat.forPattern("yyyyMMdd'T'HH:mm:ss'Z'");
DateTime dateTime = df.parseDateTime("2013­-04­-02T08:37:56Z");
Date date = dateTime.toDate();

答案 2 :(得分:0)

将您的示例转换为十六进制后,您似乎没有使用普通连字符(0x2D),而是使用名为“soft hyphen”的类似字符(根据我的记事本++转换器0xC2AD)。