带时区的无法解析的日期
unparseable date with timezone
我必须解析这两个日期
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();
}
}
我的代码有什么问题?
您的日期格式定义有误:
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";
字符串中没有减号
更新:
更新问题后,我认为 -
符号不是减号。它只是看起来如此。替换此标志。然后重试。
如下更改您的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();
将您的示例转换为十六进制后,您似乎没有使用普通的连字符 (0x2D
),而是使用了一个名为 'soft hyphen' 的类似字符(0xC2AD
,根据我的记事本++转换器)。
我必须解析这两个日期
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();
}
}
我的代码有什么问题?
您的日期格式定义有误:
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";
字符串中没有减号
更新:
更新问题后,我认为 -
符号不是减号。它只是看起来如此。替换此标志。然后重试。
如下更改您的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();
将您的示例转换为十六进制后,您似乎没有使用普通的连字符 (0x2D
),而是使用了一个名为 'soft hyphen' 的类似字符(0xC2AD
,根据我的记事本++转换器)。