Преобразование LocalDateTime в Date, без изменения времени [дубликат]

Angular1

Для людей, которые используют AngularJS , может справиться с этой ситуацией, используя Promises.

Здесь it говорит,

Обещания могут использоваться для отключения асинхронных функций и позволяют объединять несколько функций вместе.

Вы можете найти приятное объяснение здесь .

Пример, найденный в docs , упомянутом ниже.

  promiseB = promiseA.then(
    function onSuccess(result) {
      return result + 1;
    }
    ,function onError(err) {
      //Handle error
    }
  );

 // promiseB will be resolved immediately after promiseA is resolved 
 // and its value will be the result of promiseA incremented by 1.

Angular2 and Later

In Angular2, посмотрите на следующий пример, но его рекомендовал использовать Observables с Angular2.

 search(term: string) {
     return this.http
  .get(`https://api.spotify.com/v1/search?q=${term}&type=artist`)
  .map((response) => response.json())
  .toPromise();

}

Вы можете использовать это таким образом,

search() {
    this.searchService.search(this.searchField.value)
      .then((result) => {
    this.result = result.artists.items;
  })
  .catch((error) => console.error(error));
}

См. здесь оригинал . Но TypScript не поддерживает native es6 Promises , если вы хотите его использовать, для этого вам может понадобиться плагин.

Кроме того, здесь представлены обещания spec определите здесь.

366
задан JodaStephen 19 October 2014 в 22:27
поделиться

6 ответов

Короткий ответ:

Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Date out = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());

Объяснение: (на основе этот вопрос о LocalDate)

Несмотря на свое имя, java.util.Date представляет мгновение на линии времени, а не «дата». Фактические данные, хранящиеся в объекте, представляют собой long счет миллисекунд с 1970-01-01T00: 00Z (полночь в начале 1970 GMT / UTC).

Эквивалентный класс для java.util.Date в JSR-310 является Instant, поэтому есть удобные способы для обеспечения преобразования в:

Date input = new Date();
Instant instant = input.toInstant();
Date output = Date.from(instant);

Экземпляр java.util.Date не имеет понятия о временной зоне. Это может показаться странным, если вы назове toString() на java.util.Date, потому что toString относится к временной зоне. Однако этот метод фактически использует временную зону Java по умолчанию для предоставления строки. Часовой пояс не является частью фактического состояния java.util.Date.

Instant также не содержит никакой информации о временной зоне. Таким образом, для преобразования из Instant в локальную дату-время необходимо указать временную зону. Это может быть зона по умолчанию - ZoneId.systemDefault() - или это может быть временная зона, которую контролирует ваше приложение, например часовая зона от пользовательских настроек. LocalDateTime имеет удобный заводский метод, который принимает как мгновенную, так и временную зону:

Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());

В обратном порядке LocalDateTime зона времени задается вызовом метода atZone(ZoneId). Затем ZonedDateTime можно преобразовать непосредственно в Instant:

LocalDateTime ldt = ...
ZonedDateTime zdt = ldt.atZone(ZoneId.systemDefault());
Date output = Date.from(zdt.toInstant());

Обратите внимание, что преобразование с LocalDateTime в ZonedDateTime может привести к неожиданному поведению. Это связано с тем, что не всегда существует локальная дата-время из-за летнего времени. Осенью / осенью в локальной временной линии происходит перекрытие, где одно и то же локальное время-дата происходит дважды. Весной есть пробел, где час исчезает. См. Javadoc из atZone(ZoneId) для более подробного определения того, что будет делать преобразование.

Сводка, если вы совершите кругооборот java.util.Date до LocalDateTime и обратно к java.util.Date вы можете получить другой момент из-за перехода на летнее время.

Дополнительная информация: Существует еще одна разница, которая повлияет на очень старые даты. java.util.Date использует календарь, который имеет шансы 15 октября 1582 года, с датами до этого с использованием юлианского календаря вместо григорианского. Напротив, java.time.* использует систему календаря ISO (эквивалентно григорианскому) на все время. В большинстве случаев система календаря ISO - это то, что вы хотите, но вы можете видеть нечетные эффекты при сравнении дат до 1582 года.

567
ответ дан Community 4 September 2018 в 08:59
поделиться

Вот что я придумал (и, как и все головоломки «Время по времени», вероятно, это будет опровергнуто на основе какой-то странной корректировки дневного времени-прыжка: D)

Круговое отключение: Date & lt; - >> LocalDateTime

Учитывая: Date date = [some date]

(1) LocalDateTime & lt; Instant & л; & л; Date

    Instant instant = Instant.ofEpochMilli(date.getTime());
    LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);

(2) Date & lt; Instant & lt; LocalDateTime

    Instant instant = ldt.toInstant(ZoneOffset.UTC);
    Date date = Date.from(instant);

Пример:

Дан:

Date date = new Date();
System.out.println(date + " long: " + date.getTime());

(1) LocalDateTime & lt; Instant & л; & л; Date:

Создайте Instant из Date:

Instant instant = Instant.ofEpochMilli(date.getTime());
System.out.println("Instant from Date:\n" + instant);

Создайте Date с Instant (необязательно, но для иллюстрации):

date = Date.from(instant);
System.out.println("Date from Instant:\n" + date + " long: " + date.getTime());

Создать LocalDateTime из Instant

LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);
System.out.println("LocalDateTime from Instant:\n" + ldt);

(2) Date & lt; Instant & lt; LocalDateTime

Создайте Instant из LocalDateTime:

instant = ldt.toInstant(ZoneOffset.UTC);
System.out.println("Instant from LocalDateTime:\n" + instant);

Создайте Date из Instant:

date = Date.from(instant);
System.out.println("Date from Instant:\n" + date + " long: " + date.getTime());

Выход :

Fri Nov 01 07:13:04 PDT 2013 long: 1383315184574

Instant from Date:
2013-11-01T14:13:04.574Z

Date from Instant:
Fri Nov 01 07:13:04 PDT 2013 long: 1383315184574

LocalDateTime from Instant:
2013-11-01T14:13:04.574

Instant from LocalDateTime:
2013-11-01T14:13:04.574Z

Date from Instant:
Fri Nov 01 07:13:04 PDT 2013 long: 1383315184574
114
ответ дан 19 revs, 2 users 99% 4 September 2018 в 08:59
поделиться

Гораздо более удобный способ, если вы уверены, что вам нужен часовой пояс по умолчанию:

Date d = java.sql.Timestamp.valueOf( myLocalDateTime );
17
ответ дан bernard paulus 4 September 2018 в 08:59
поделиться

похоже, что при преобразовании из нового API LocalDateTime в java.util.date:

Date.from(ZonedDateTime.of({time as LocalDateTime}, ZoneId.systemDefault()).toInstant());

обратное преобразование может быть (надеюсь) достигнуто аналогичным образом ...

надеюсь, что это поможет ...

8
ответ дан dizzy 4 September 2018 в 08:59
поделиться

Все здесь: http://blog.progs.be/542/date-to-java-time

Ответ с «круглым отключением» не является точно: когда вы делаете

LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);

, если ваш часовой пояс системы не UTC / GMT, вы меняете время!

3
ответ дан joe-mojo 4 September 2018 в 08:59
поделиться

Я не уверен, что это самый простой или лучший способ, или если есть какие-то подводные камни, но он работает:

static public LocalDateTime toLdt(Date date) {
    GregorianCalendar cal = new GregorianCalendar();
    cal.setTime(date);
    ZonedDateTime zdt = cal.toZonedDateTime();
    return zdt.toLocalDateTime();
}

static public Date fromLdt(LocalDateTime ldt) {
    ZonedDateTime zdt = ZonedDateTime.of(ldt, ZoneId.systemDefault());
    GregorianCalendar cal = GregorianCalendar.from(zdt);
    return cal.getTime();
}
3
ответ дан Knut Arne Vedaa 4 September 2018 в 08:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: