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

分析可能格式不同的日期

  •  0
  • BnJ  · 技术社区  · 6 年前

    我必须分析 String 以UTC表示的时间戳。这个 可以具有以下格式:

    • YYYY-MM-DDThh:mm:ss.sssZ
    • YYYY-MM-DDThh:mm:ss.sss+/-hh:mm
    • YYYY-MM-DDThh:mm:ss.sss (在UTC考虑,因此添加 Z

        try {
            firstDateTimeFormatter.parse(string, Instant::from).toEpochMilli();
        } catch (DateTimeParseException e) {
            try {
                secondDateTimeFormatter.parse(string, Instant::from).toEpochMilli();
            } catch (DateTimeParseException e2) {
                    thirdDateTimeFormatter.parse(string, Instant::from).toEpochMilli();
            }
        }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Anonymous    6 年前

    有多种选择。这里是一个简单的例子:

    private static DateTimeFormatter formatter 
            = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSS[XXX]")
                    .withZone(ZoneOffset.UTC);
    
    public static Instant parse(String offsetDateTimeString) {
        return OffsetDateTime.parse(offsetDateTimeString, formatter).toInstant();
    }
    

    让我们试试看:

        System.out.println(parse("2018-08-04T21:41:55.987Z"));
        System.out.println(parse("2018-08-04T19:41:55.987-02:00"));
        System.out.println(parse("2018-08-04T21:41:55.987"));
    

    印刷品:

    2018-08-04T21:41:55.987Z
    2018-08-04T21:41:55.987Z
    2018-08-04T21:41:55.987Z
    

    X 使用 Z 对于偏移零,所以匹配三种格式中的前两种。要指定字符串中没有任何字符时要使用的偏移量,我在格式化程序上设置了默认的时区UTC。

    变化包括:

    • 您可以使用预定义的ISO格式,而不是自己编写整个格式模式字符串。
    • 由于我们是在偏移量之后,而不是在时区之后,因此指定默认偏移量而不是默认时区可能更为正确。

    DateTimeFormatterBuilder 让我们两者兼得。因此,在这里,您可以在上述代码中使用不同的格式化程序:

    private static DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
            .appendPattern("[XXX]")
            .parseDefaulting(ChronoField.OFFSET_SECONDS, ZoneOffset.UTC.getTotalSeconds())
            .toFormatter();
    

    结果是相同的。