Для людей, которые используют 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 определите здесь.
Короткий ответ:
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 года.
Вот что я придумал (и, как и все головоломки «Время по времени», вероятно, это будет опровергнуто на основе какой-то странной корректировки дневного времени-прыжка: 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());
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);
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
Гораздо более удобный способ, если вы уверены, что вам нужен часовой пояс по умолчанию:
Date d = java.sql.Timestamp.valueOf( myLocalDateTime );
похоже, что при преобразовании из нового API LocalDateTime в java.util.date:
Date.from(ZonedDateTime.of({time as LocalDateTime}, ZoneId.systemDefault()).toInstant());
обратное преобразование может быть (надеюсь) достигнуто аналогичным образом ...
надеюсь, что это поможет ...
Все здесь: http://blog.progs.be/542/date-to-java-time
Ответ с «круглым отключением» не является точно: когда вы делаете
LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);
, если ваш часовой пояс системы не UTC / GMT, вы меняете время!
Я не уверен, что это самый простой или лучший способ, или если есть какие-то подводные камни, но он работает:
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();
}