JSON日期到Java日期?

JSON date to Java date?

本问题已经有最佳答案,请猛点这里访问。

我在任何地方都找不到这个。我从返回标准JSON日期的API中获取一些JSON。您可以通过在javascript控制台中运行此代码来查看格式:

1
2
> new Date().toJSON();
"2010-10-27T11:58:22.973Z"

实际上,我正在使用的API并没有返回毫秒部分,有时它返回时区而不是Z,所以日期可以类似于其中的任何一个:

  • 2010-10-27T11:58:22Z
  • 2010-10-27T11:58:22+03:00

解析这些日期有点麻烦。有没有办法用org.json来解析这些日期?

我目前的解决方案是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static Date parseDateTime(String dateString) {
    if (dateString == null) return null;
    DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ");
    if (dateString.contains("T")) dateString = dateString.replace('T', ' ');
    if (dateString.contains("Z")) dateString = dateString.replace("Z","+0000");
    else
        dateString = dateString.substring(0, dateString.lastIndexOf(':')) + dateString.substring(dateString.lastIndexOf(':')+1);
    try {
        return fmt.parse(dateString);
    }
    catch (ParseException e) {
        Log.e(Const.TAG,"Could not parse datetime:" + dateString);
        return null;
    }
}

呸!


日期时间格式实际上是ISO 8601日期时间。JSON没有为日期/时间指定任何特定的格式。如果你有一点谷歌,你会发现很多实现在Java中解析它。

这里有一个

如果您愿意使用除了Java的内置日期/时间/日历类之外的其他东西,我也建议JoDA时间。它们提供(在许多方面)一个ISODateTimeFormat来解析这些类型的字符串。


请注意,simpledateformat格式模式z用于RFC 822时区,模式x用于ISO 8601(此标准支持单字母时区名称,如z用于zulu)。

因此,new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX")生成一种既可以解析"2013-03-11T01:38:18.309Z"又可以解析"2013-03-11T01:38:18.309+0000"的格式,并将得到相同的结果。

不幸的是,据我所知,您无法使用此格式为zulu版本生成z,这很烦人。

实际上,在JavaScript方面,我在处理这两种格式时遇到了更多的麻烦。


如果您需要支持多个格式,则必须对输入进行模式匹配,并相应地进行分析。

1
2
3
4
5
6
final DateFormat fmt;
if (dateString.endsWith("Z")) {
    fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
} else {
    fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
}

我猜你正在处理的API中的一个错误引用了Z时区日期模式…