首页 > 解决方案 > 使用时区标识符解析未知的 DateTime 字符串

问题描述

这个字符串如何20190612070000.000[-4:EDT]解析成ZonedDateTime

我已经尝试过这种模式和其他模式,但到目前为止没有任何效果:

String dateString = "20190612070000.000[-4:EDT]";

ZonedDateTime dateTime = ZonedDateTime.parse(dateString, ofPattern("yyyyMMddHHmmss.S[x:z]"));

标签: javadatetimetime

解决方案


DateTimeFormatter没有与您的日期时间字符串匹配的模式的OOTB(开箱即用) 。您可以使用DateTimeFormatterBuilder.

演示:

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.TextStyle;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtf = new DateTimeFormatterBuilder()
                                .appendPattern("uuuuMMddHHmmss.SSS")
                                .appendLiteral('[')                                
                                .appendOffset("+H", "")
                                .appendLiteral(':')
                                .appendZoneText(TextStyle.SHORT)
                                .appendLiteral(']')
                                .toFormatter(Locale.ENGLISH);
                                
        String strDateTime = "20190612070000.000[-4:EDT]";
        
        ZonedDateTime zdt = ZonedDateTime.parse(strDateTime, dtf);
        System.out.println(zdt);
    }
}

输出:

2019-06-12T07:00-04:00[America/New_York]

Trail: Date Time了解更多关于java.time现代日期时间 API *的信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,则可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到 Java 6 和 7。如果您正在为 Android 项目和 Android API 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project


推荐阅读