-1

我有一个表示带区域的日期时间的字符串,我想将字符串表达式转换为LocalDateTime.

我尝试将其解析为ZonedDateTimeusingparse方法,但因错误而失败

 @SerializedName("Expires")
 private String expires = "Sat, 13 Jun 2020 23:14:21 GMT";

 public LocalDateTime getExpiredDateTime() {
     return ZonedDateTime.parse(expires).toLocalDateTime();
 }

预期结果:一个LocalDateTime2020-06-13T23:14:21

观察结果:

线程“main”java.time.format.DateTimeParseException 中的异常:无法在索引 0 处解析文本“Sat,2020 年 6 月 13 日 23:14:21 GMT”

4

2 回答 2

4

Java为特定的输入格式提供了一个格式化程序。该格式用于较旧的协议,例如RFC 1123(现在在现代协议中被 ISO 8601 取代)。

ZonedDateTime
.parse(
    "Sat, 13 Jun 2020 23:14:21 GMT" ,
    DateTimeFormatter. RFC_1123_DATE_TIME
)
.toLocalDateTime()

该输入是设计不佳的遗留格式。我建议对这些数据的发布者进行有关ISO 8601的教育。

于 2020-06-13T15:41:24.530 回答
1
import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        String dateTimeStr = "Sat, 13 Jun 2020 23:14:21 GMT";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss z");
        ZonedDateTime zdt = ZonedDateTime.parse(dateTimeStr, formatter);
        System.out.println(zdt);

        LocalDateTime ldt = zdt.toLocalDateTime();
        System.out.println(ldt);
    }
}

输出:

2020-06-13T23:14:21Z[GMT]
2020-06-13T23:14:21

[更新] 由 Basil Bourque 提供

import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        String dateTimeStr = "Sat, 13 Jun 2020 23:14:21 GMT";

        DateTimeFormatter formatter = DateTimeFormatter.RFC_1123_DATE_TIME;

        ZonedDateTime zdt = ZonedDateTime.parse(dateTimeStr, formatter);
        System.out.println(zdt);

        LocalDateTime ldt = zdt.toLocalDateTime();
        System.out.println(ldt);
    }
}

输出:

2020-06-13T23:14:21Z
2020-06-13T23:14:21
于 2020-06-13T15:41:39.807 回答