代码之家  ›  专栏  ›  技术社区  ›  Felix

JSON日期到Java日期?[副本]

  •  33
  • Felix  · 技术社区  · 14 年前

    我哪儿也找不到这个。我从返回标准JSON日期的API中获取一些JSON。您可以在JavaScript控制台中运行以下代码来查看格式:

    > 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 ?

    我目前的解决方案是:

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

    啊!

    3 回复  |  直到 14 年前
        1
  •  20
  •   codelark    14 年前

    这个日期时间格式实际上是ISO 8601 DateTime。JSON没有为日期/时间指定任何特定格式。如果你在Google上搜索一下,你会发现有很多实现可以在Java中解析它。

    Here's one

    如果您愿意使用Java内置的日期/时间/日历类以外的其他类,我还建议您 Joda Time ISODateTimeFormat 来解析这些字符串。

        2
  •  14
  •   Chuck    12 年前

    请注意,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"

    不幸的是,据我所知,您无法使用这种格式生成Z for Zulu版本,这很烦人。

        3
  •  6
  •   Jon Freedman    14 年前

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

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

    Z 时区日期模式。。。