使用SimpleDateFormat解析结果的奇怪日期和时间

时间:2010-11-06 15:59:12

标签: java android parsing date simpledateformat

使用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上。

我该如何解决?

5 个答案:

答案 0 :(得分:6)

如果您使用mm代替MM,则问题可以重现。

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

答案 1 :(得分:2)

可能不是您的问题,但由于SimpleDateFormat is not thread safe您需要将代码更改为:

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

答案 2 :(得分: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()));  

答案 3 :(得分: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 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());
}

}

    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());
}

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

答案 4 :(得分: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的问题我认为与你使用的语言环境有关。你应该尝试用不同的语言环境来测试它。