6

使用 SimpleDateFormat 解析 ISO8601 日期和时间时遇到一个奇怪的问题。相关代码为:

public class DateHelper
{
    private static SimpleDateFormat iso8601formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
    public static Date parseISO8601(String date) throws ParseException
    {
        Date result = iso8601formatter.parse(date);
        return result;
    }
}

对于输入,我给它一个字符串

2010-09-06T15:30:00+02:00

作为回报,我得到一个 Date 对象,其日期设置为 2010 年 1 月 6 日,时间为 13:30,时区为 GMT+00:00。

编辑:我也尝试使用“2010-09-06T15:30:00+0200”得到相同的结果。

令人困惑的是,日期设置部分正确,只是月份设置错误。

该问题出现在 Android 1.6 和 Android 2.2 上。

我该如何解决?

4

5 回答 5

6

如果您使用mmfor month 而不是MM.

所以我怀疑问题的原因就在那里,并且您没有运行您认为正在运行的代码版本。按照您的问题重新编译并重新执行代码。这是正确的。

于 2010-11-07T13:30:19.413 回答
2

可能不是您的问题,但由于SimpleDateFormat 不是线程安全的,您需要将代码更改为:

public class DateHelper
{
    public static Date parseISO8601(String date) throws ParseException
    {
        return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse(date);
    }
}
于 2010-11-06T16:06:31.387 回答
2

你在处理 ParseException 吗?代码应该为该输入字符串抛出 ParseException。
不确定Android,但对于Java 6,输入字符串2010-09-06T15:30:00+02:00无效。

+02:00不是有效的时区。
不带冒号试试:

    2010-09-06T15:30:00+0200  

一个技巧(测试)是使用 DateFormat 格式化日期并检查创建的字符串:

    System.out.println(iso8601formatter.format(new Date()));  
于 2010-11-06T17:26:03.323 回答
1

我创建了一个 1.6 项目,代码为我工作......

public class DateHelper {
    private static SimpleDateFormat iso8601formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");

public static Date parseISO8601(String date) throws ParseException {
    Date result = iso8601formatter.parse(date);
    return result;
}

public static String makeISO8601String(Date date) {
    return iso8601formatter.format(date);
}

}

public class StackOverflowTest extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

    TextView textView = (TextView)this.findViewById(R.id.textView);

    StringBuilder builder = new StringBuilder();
    try {
        String badDateString = "2010-09-06T15:30:00+0200";
        Date parsedDate = DateHelper.parseISO8601(badDateString);
        builder.append(badDateString).append("\n");
        builder.append(parsedDate.toString()).append("\n");
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    String dateString = DateHelper.makeISO8601String(new Date());
    builder.append("now="+dateString).append("\n");

    textView.setText(builder.toString());
}

}

对我来说,它打印出来:

2010-09-06T15:30:00+0200
Mon Sep 06 06:30:00 PDT 2010
now=2010-11-06T14:41:55-077

这对我来说都是正确的......

于 2010-11-06T21:45:35.603 回答
0

解析你应该使用的第一个字符串

public static Date parseDateFromString(String aDateString){
    SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz");
    Date date=null;
    try {
        date= inputFormat.parse(aDateString);
    } catch (ParseException e) {
        return null;
    }
    return date;

当解析像 +02:00 这样的时区时,它是 z 而不是 Z。希望它有所帮助。我认为给你 +00:00 的问题与你使用的语言环境有关。您应该尝试使用不同的语言环境对其进行测试。

于 2010-11-07T13:13:12.450 回答