ТЛ; др
Есть ли способ получить реальную текущую дату и время в зависимости от часового пояса.
Да. Используйте современные java.time , а не ужасные унаследованные классы.
ZonedDateTime.now( // Represent a moment as seen through the wall-clock time used by the people of a particular region (a time zone).
ZoneId.of( "America/Chicago" ) // Specify time zone by proper `Continent/Region` name, *never* 2-4 letter pseudo-zones such as “CST”.
) // Returns a `ZonedDateTime` object.
.toString() // Generate text in standard ISO 8601 format wisely extended to append the name of the time zone in square brackets.
2018-11-07T14: 38: 24.723394-06: 00 [Америка / Чикаго]
Подробнее
Мое приложение размещено на лондонском сервере. Я в Минасоте, США.
Это не должно относиться к вашему приложению.
- Сервер должен по умолчанию использовать часовой пояс UTC (как правило).
- Клиента следует попросить подтвердить его желаемый / ожидаемый часовой пояс (когда это критично).
- Всегда явно указывайте желаемый / ожидаемый часовой пояс, передавая необязательный аргумент, вместо того чтобы неявно полагаться на текущее время по умолчанию JVM, которое может измениться в любой момент в течение времени выполнения (!).
Как узнать текущую дату / время с моим часовым поясом.
Во-первых, большая часть вашей бизнес-логики, хранения и обмена значениями даты и времени должна выполняться в UTC.
Instant instant = Instant.now() ; // Current moment in UTC.
Вы можете увидеть тот же момент через объектив настенных часов, используемых людьми определенного региона, часового пояса.
Часовой пояс для Миннесоты равен America/Chicago
.
Укажите собственное имя часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте 2-4 буквенные сокращения, такие как CST
или EST
или IST
, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "America/Chicago" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
В качестве ярлыка вы можете пропустить Instant
.
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
Но я хочу НАСТОЯЩУЮ текущую дату и время
➥ Вот основная концепция в освоении работы с датой и временем: Instant
(UTC) и ZonedDateTime
(некоторый часовой пояс), показанные выше , представляют собой одно и то же момент . Эти два объекта представляют одну и ту же точку на временной шкале. Они оба «РЕАЛЬНЫЕ дата и время». Они используют два разных времени настенных часов, чтобы показать один и тот же момент.
Если человек в Исландии разговаривал по телефону с кем-то из Миннеаполиса, и они оба смотрят на стене свои соответствующие часы и календари, чтобы произнести вслух текущую дату и время, какой из них является правильным? Оба варианта верны, два способа выразить один и тот же момент одновременно.
Действительно, вам лучше было бы думать о UTC как One True Time ™ со всеми зонированными временами как с простыми вариациями. Сосредоточение внимания на своем собственном приходском часовом поясе, а затем перевод туда-сюда, приведут вас в замешательство. Сосредоточьтесь на UTC, настройте часовой пояс только тогда, когда это ожидается пользователем или требуется бизнес-логикой.
Все это уже много раз освещалось в Переполнении стека. Так что ищите больше информации и примеров. И научитесь искать переполнение стека перед публикацией.
Чтобы сгенерировать строки, либо наберите toString
для текста в стандартном формате ISO 8601, либо используйте DateTimeFormatter.ofLocalized…
для автоматической локализации, либо используйте DateTimeFormatter.ofPattern
для указания пользовательского шаблона форматирования. Об этом много раз говорилось о переполнении стека, поэтому ищите больше информации.
О java.time
Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует выполнить переход на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Вы можете обмениваться java.time объектами напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Wherе получить классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и more .