目录

Java 解析 RFC3339 日期

目录

最近在写一个简单的 Atom 解析类,需要解析其中使用的 RFC3339 规定的日期,碰到了几个小问题,发现这个功能还是需要特别注意一下。

RFC3339 定义的日期格式大体是:年-月-日T时-分-秒时区(其中,T 就只是字母 T)。示例为:2010-01-01T01:01:01+01:00

这里使用 SimpleDateFormat 来解析数据,具体细节要注意:

  • 可能日期没有时区定义,即结尾使用单个大写字母 Z
  • 时间的秒对应数字可能有小数

正常的解析模式应该是 yyyy-MM-dd'T'HH:mm:ssX,结合上面的讨论还有 3 种情况需要解析:

  • yyyy-MM-dd'T'HH:mm:ss.SSSX:秒数有小数
  • yyyy-MM-dd'T'HH:mm:ss'Z':无时区
  • yyyy-MM-dd'T'HH:mm:ss.SSS'Z':无时区,且秒数有小数

相应的示例代码为:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.text.ParseException;
import java.text.SimpleDateFormat;

public class DateTest {

    public static void main(String[] args) {
        String input = "2017-02-01T03:59:40.944Z";      // 测试用的示例日期字符串
        String[] patterns = {
                "yyyy-MM-dd'T'HH:mm:ssX",
                "yyyy-MM-dd'T'HH:mm:ss.SSSX",
                "yyyy-MM-dd'T'HH:mm:ss'Z'",
                "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
        };
        for (String pattern :
                patterns) {
            try {
                System.out.println(new SimpleDateFormat(pattern).parse(input));
            } catch (ParseException e) {
                // 不匹配的模式会抛出异常
            }
        }
    }

}

目前个人测试的数据都可以正常解析,即使出现了不可解析的模式也不难扩展,只要加入新的模式字符串到 patterns 里即可。

Android 编程特别注意: Android 目前的 SimpleDateFormat 格式中默认不支持 X 模式,可以使用 ZZZZZ 代替,相应的 patterns 为:

1
2
3
4
5
6
String[] patterns = {
        "yyyy-MM-dd'T'HH:mm:ssZZZZZ",
        "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ",
        "yyyy-MM-dd'T'HH:mm:ss'Z'",
        "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
};

参考: https://tools.ietf.org/html/rfc3339 http://stackoverflow.com/questions/28373610/android-parse-string-to-date-unknown-pattern-character-x