Как получить правильную дату и время без времени сервера в Java с часовым поясом в качестве входных данных - PullRequest
0 голосов
/ 07 ноября 2018

Мое приложение размещено на сервере в Лондоне. Я в Минасоте, США. Так что часовой пояс отличается часами.

Как узнать текущую дату / время с моим часовым поясом. Сложность в том, что я не хочу получать текущую дату и время на основе даты и времени сервера. Есть ли способ получить реальную текущую дату и время в зависимости от часового пояса.

Приведенный ниже код возвращает информацию, но если дата на сервере недействительна, то ответ также будет недействительной. Но я хочу НАСТОЯЩУЮ текущую дату и время. Мой вход будет часовой пояс. Любая помощь приветствуется.

    Date date = new Date();
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

 // Use Minasota's time zone to format the date in
    df.setTimeZone(TimeZone.getTimeZone("America/Minasota"));
    System.out.println("Date and time in Minasota: " + df.format(date));

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

ТЛ; др

Есть ли способ получить реальную текущую дату и время в зависимости от часового пояса.

Да. Используйте современные 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 .

0 голосов
/ 07 ноября 2018

Важно знать, что использование трехбуквенных сокращений часовых поясов в java 8 не рекомендуется, поэтому не стоит ожидать, что они будут поддерживаться вечно. Вот два эквивалентных примера использования Java API времени 8 для достижения этой цели:

System.out.println(Instant.now().atZone(ZoneId.of("CST",ZoneId.SHORT_IDS)));
System.out.println(Instant.now().atZone(ZoneId.of("America/Chicago")));

Возможно, этот вопрос является дубликатом этого

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...