Конвертировать Java.util.Calendar в org.threeten.bp.LocalDateTime (для Android)
Как конфертировать из Android Java Date and Calendar в тройку LocalDateTime
Calendar calTime = Calendar.getInstance();
Date date = calTime.getTime();
LocalDateTime ldt = Instant.ofEpochSecond(date.getTime()/1000)
.atZone(ZoneId.systemDefault())
.toLocalDateTime();
Исправлена!
1 ответ
Ваше решение не оптимально.
LocalDateTime
не имеет зоны / смещения
Во-первых, ваше использование LocalDateTime
неуместно почти наверняка. Вы отбрасываете ценную информацию о часовом поясе или смещении. LocalDateTime
класс преднамеренно не имеет понятия о часовом поясе или смещении от UTC и поэтому не представляет фактический момент, а лишь приблизительное представление о возможных моментах в диапазоне от 26 до 27 часов или около того.
Вместо этого используйте Instant
, OffsetDateTime
, а также ZonedDateTime
когда речь идет о реальных моментах на временной шкале.
Мы используем только LocalDateTime
когда:
- Мы не знаем зону.
- Мы намерены создать несколько зон в одно и то же время ("все наши заводы по всему миру закрываются в полдень на обед").
- Мы планируем на будущее больше, чем на несколько недель, и поэтому мы можем получить удар от капризных политиков, переоценивающих часовой пояс, таких как летнее время (DST), с небольшим уведомлением. Мы используем
LocalDateTime
для логики, и представить пользователю какZonedDateTime
при создании переходного календаря.
DateTimeUtils
для конверсий
Далее, ваша математика преобразования не нужна.
DateTimeUtils
Класс предоставляет служебные методы для преобразований.
ZonedDateTime zdt = DateTimeUtils.toZonedDateTime( myCalendar ) ;
или же…
Instant instant = DateTimeUtils.toInstant( myCalendar ) ;
PS Не отвечайте на свой вопрос внутри основного текста вопроса. Вместо этого опубликуйте фактический ответ, а затем примите его, чтобы закрыть вопрос.
Советы: Для тех, кто хочет использовать ThreeTen-Backport в Android, см. Проект ThreeTenABP. И посмотрите, как использовать ThreeTenABP в Android Project.