【问题标题】:Strange date and time parsing result with SimpleDateFormat使用 SimpleDateFormat 的奇怪日期和时间解析结果
【发布时间】:2010-11-06 15:59:11
【问题描述】:

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

我该如何解决?

【问题讨论】:

  • 可能无关紧要,但是执行此代码的计算机位于哪个时区?格林威治标准时间+2?
  • 在我的 2.2 模拟器中运行良好。您的具体设置是什么(模拟器、手机、版本)以及如何检查生成的 Date 对象(调试、日志)?
  • @Josef 我正在使用 1.6 模拟器进行测试。但是我注意到了这个问题,因为我的 GUI 显示 1 月份的日期,并且在安装 1.6 Sense 的 HTC Tatto、安装 2.1 的 HTC Hero 和安装 2.2 的 G1 上都注意到了这一点。 @cherouvim Computer 目前处于 GMT+1 (CET)。也许重要的是要注意我在夏令时更改后注意到了这个问题。

标签: java android parsing date simpledateformat


【解决方案1】:

如果您在月份使用 mm 而不是 MM,您的问题是可以重现的。

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

【讨论】:

  • 用 Galileo 而不是 Helios 重新安装 Eclipse,重新签出项目并重建就可以了。
  • 重建还不够吗?
  • 出于某种原因,不是。
【解决方案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);
    }
}

【讨论】:

  • 感谢您的警告,将更改它。你说得对,不过这不是我的问题。
【解决方案3】:

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

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

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

一个trick(测试)是使用DateFormat格式化一个Date并检查创建的String:

    System.out.println(iso8601formatter.format(new Date()));  

【讨论】:

  • OP已经提到他也尝试过“2010-09-06T15:30:00+0200”。
  • @johnbk - 我明白了,只是错过了......但第一个字符串仍然应该有 ParseException
  • 也不例外。正如我所说,我得到了返回的数据,只是月份设置错误:\
【解决方案4】:

我创建了一个 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

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

【讨论】:

    【解决方案5】:

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

    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 的问题与你使用的语言环境有关。您应该尝试使用不同的语言环境对其进行测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-21
      • 2023-04-05
      • 1970-01-01
      • 2016-04-19
      • 2019-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多