【问题标题】:ZonedDateTime from date string in yyyy-mm-ddZonedDateTime 来自 yyyy-mm-dd 中的日期字符串
【发布时间】:2021-01-10 15:49:05
【问题描述】:

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

在使用 TemporalAccesor 和 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);
}

【问题讨论】:

  • yyyy-mm-ddLocalDate 中存储的信息完全相同。要拥有ZoneDateTime,您需要时间组件和一些您似乎没有的区域信息。为什么要将其解析为ZonedDateTime
  • 确实,即使您最终想要 ZonedDateTime,我认为如果您将其解析为 LocalDate 然后通过提供时间将其转换为 ZonedDateTime,期望会更清晰日期和时区。

标签: java date-format java-time zoneddatetime datetimeformatter


【解决方案1】:

正如评论部分链接的帖子中提到的那样:

问题是ZonedDateTime 需要构建所有日期和时间字段(年、月、日、小时、分钟、秒、纳秒),但格式化程序 ISO_OFFSET_DATE 生成的字符串没有时间部分。

以及相关的解决方案

解析它的另一种方法是使用DateTimeFormatterBuilder 并为时间字段定义默认值

【讨论】:

    【解决方案2】:

    ISO_OFFSET_DATE 中的偏移量表示时区被指定为相对于 UTC 的相对偏移量

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

    【讨论】:

    【解决方案3】:

    使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-19
      • 1970-01-01
      • 2016-12-25
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      相关资源
      最近更新 更多