ZonedDateTime 来自 yyyy-mm-dd 中的日期字符串

ZonedDateTime from date string in yyyy-mm-dd

正在尝试从日期字符串(例如“2020-08-24”)解析 ZonedDateTime。

使用 TemporalAccessor 和 DateTimeFormatter.ISO_OFFSET_DATE 进行解析后,我得到了 java.time.format.DateTimeParseException。我使用了错误的格式化程序吗?

甚至尝试在日期字符串的末尾添加 'Z' 以使其被理解为 UTC

private ZonedDateTime getZonedDateTime(String dateString) {
  TemporalAccessor parsed = null;
  dateString = dateString + 'Z';
  try {
     parsed = DateTimeFormatter.ISO_OFFSET_DATE.parse(dateString);
  } catch (Exception e) {
     log.error("Unable to parse date {} using formatter DateTimeFormatter.ISO_INSTANT", dateString);
  }
  return ZonedDateTime.from(parsed);
}

如评论部分中链接的 [=18th=] 所述:

The problem is that ZonedDateTime needs all the date and time fields to be built (year, month, day, hour, minute, second, nanosecond), but the formatter ISO_OFFSET_DATE produces a string without the time part.

及相关解决方案

One alternative to parse it is to use a DateTimeFormatterBuilder and define default values for the time fields

offset in ISO_OFFSET_DATE 表示时区指定为相对于 UTC

的相对偏移量

所以在您输入的末尾应该有类似“+01:00”的内容。

使用LocalDate#atStartOfDay

按如下操作:

import java.time.LocalDate;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        // Define a DateTimeFormatter
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd");

        // Given date string
        String strDate = "2020-08-24";

        // Parse the given date string to ZonedDateTime
        ZonedDateTime zdt = LocalDate.parse(strDate, dtf).atStartOfDay(ZoneOffset.UTC);

        System.out.println(zdt);
    }
}

输出:

2020-08-24T00:00Z