tl;dr
Часовой пояс не имеет значения для прошедших часов-минут-секунд.
Duration.between(
Instant.parse( "2017-12-14T01:34:56.123456789Z" ) ;
Instant.now()
)
Java.время
В современном подходе используются лучшие в отрасли классы java.time. Они заменяют проблемные старые устаревшие классы даты и времени, такие как Date
и Calendar
.
Серверы обычно должны быть настроены на часовой пояс UTC. И вы никогда не должны зависеть от каких-либо таких настроек. Вместо этого ваш код должен указывать желаемый/ожидаемый часовой пояс.
Ваша бизнес-логика, хранение данных и обмен данными, как правило, должны быть в формате UTC. При сериализации в текст используйте только стандартные форматы ISO 8601.
При необходимости применяйте другие часовые пояса, как того ожидает пользователь в пользовательском интерфейсе. Поэтому, как правило, вы должны думать о часовых поясах, отличных от UTC, как о проблеме локализации.
Instant
Класс Instant
представляет момент, точку на временной шкале в формате UTC с разрешением в наносекунды. На получение текущего момента не влияют настройки часового пояса.
Instant instant = Instant.now() ;
Сериализация в текст в стандартном формате с помощью вызова toString
.
String output = instant.toString() ;
Вы можете обменять Instant
с вашей базой данных.
myPreparedStatement.setObject( … , instant ) ;
…и…
Instant instant = myPreparedStatement.getObject( … , Instant.class ) ;
ZonedDateTime
Примените ZoneId
, чтобы получить ZonedDateTime
.
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
Для генерации строк в нестандартных форматах используйте класс DateTimeFormatter
. Найдите множество примеров и обсуждений в Stack Overflow.
Duration
Чтобы получить количество прошедших часов, минут, секунд, используйте класс Duration
. Обратите внимание, что вам не нужны часовые пояса для прошедшего времени; UTC (Instant
) дает тот же результат.
Duration d = Duration.between( then , Instant.now() ) ;
Для более ранних версий Android см. ThreeTen-Backport и ThreeTenABP. См. Как использовать….
О java.time
Платформа java.time встроен в Java 8 и более поздние версии. Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Проект Joda-Time, теперь в режим обслуживания, советует перейти на java.time.
Чтобы узнать больше, см. учебник по Oracle. И поищите множество примеров и пояснений в Stack Overflow. Спецификация: JSR 310.
Где получить классы java.time?
person
Basil Bourque
schedule
15.12.2017