从给定的字符串中获取 LocalDateTime 对象?

Get a LocalDateTime object from a given string?

"2021-09-17 11:48:06 UTC"

我想解析以下字符串并创建一个 LocalDateTime 对象或一个 Instant

我知道你可以这样写

String dateTime = "2021-09-17 11:48:06 UTC";
LocalDateTime dt = LocalDateTime.parse(dateTime,DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

如何处理字符串中的UTC部分?

“2021-09-17 11:48:06 UTC”不是本地日期时间:它是日期时间,因为它有时区。而且因为你的时间有时区,所以它与你的模式不匹配,而你的模式不匹配。

如果您的时间字符串总是以“UTC”结尾,您可以在模式中将其设为文字:

DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss 'UTC'");

如果需要处理UTC以外的其他时区,可以使用z:

DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");

但请注意,这是用于解析分区日期时间;从中,您可以提取本地日期时间:

ZonedDateTime zdt = ZonedDateTime.parse(dateTime,DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");
LocalDateTime ldt =z dt.toLocalDateTime();

切勿对标准时区文本进行硬编码,例如 UTCGMT

切勿对 UTCGMT 等标准时区文本进行硬编码。DateTimeFormatter 已经能够以最佳方式进行处理。

使用模式 uuuu-MM-dd HH:mm:ss VV 将给定的日期时间字符串解析为 TemporalAccessor,您可以从中获取 Instant 以及 LocalDateTime

演示:

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAccessor;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        String strDateTime = "2021-09-17 11:48:06 UTC";

        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss VV", Locale.ENGLISH);
        TemporalAccessor temporalAccessor = dtf.parse(strDateTime);

        Instant instant = Instant.from(temporalAccessor);
        LocalDateTime ldt = LocalDateTime.from(temporalAccessor);

        System.out.println(instant);
        System.out.println(ldt);
    }
}

输出:

2021-09-17T11:48:06Z
2021-09-17T11:48:06

ONLINE DEMO

或者:

使用模式 uuuu-MM-dd HH:mm:ss VV 将给定的日期时间字符串解析为 ZonedDateTime,您可以从中获取 Instant 以及 LocalDateTime

演示:

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        String strDateTime = "2021-09-17 11:48:06 UTC";

        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss VV", Locale.ENGLISH);

        ZonedDateTime zdt = ZonedDateTime.parse(strDateTime, dtf);
        Instant instant = Instant.from(zdt);
        LocalDateTime ldt = zdt.toLocalDateTime();

        System.out.println(zdt);
        System.out.println(instant);
        System.out.println(ldt);
    }
}

输出:

2021-09-17T11:48:06Z[UTC]
2021-09-17T11:48:06Z
2021-09-17T11:48:06

ONLINE DEMO

详细了解 modern Date-Time API* from Trail: Date Time


* 无论出于何种原因,如果您必须坚持Java 6 或Java 7,您可以使用ThreeTen-Backport which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and