ZoneddateTime和tolocaldate / tolocaltime
#java #time

我需要在同一应用程序中与纽约,伦敦和东京时区打交道。有时很难管理。

这就是我将ZonedDateTime转换为LocalDate的方式。在functionOne中,您不能保证参数dateTime的时区是您期望的。在转换为LocalDate之前,您始终需要先更改时区。

void functionOne(ZonedDateTime dateTime) {
    var date = dateTime.withZoneSameInstance(londonZoneId).toLocalDate();
    // use the date
}

如果他们提供函数ZonedDateTime.toLocalDate(ZoneId zoneId),我认为易于易于错误。人们在获得LocalDate时被迫提供ZoneId

这是我能想到的另一个解决方案。我们为每个时区创建一个日期时间类型。

class LondonDateTime {
  private final ZonedDateTime dateTime;

  public LondonDateTime(ZonedDateTime dateTime) {
    this.dateTime = dateTime.withZoneSameInstance(londonZoneId);
  }

  public ZonedDateTime getDateTime() { return dateTime; }

  public LocalDate getLocalDate() { return dateTime.getLocalDate(); }
}

void functionTwo(LondonDateTime dateTime) {
  var date1 = dateTime.getDateTime().toLocalDate();
  // or 
  var date2 = dateTime.toLocalDate();
}