Java Date дает неправильное время - PullRequest
2 голосов
/ 03 сентября 2011

Есть ли проблема с классом java Date (), который всегда дает мне неправильное время, например, если мое системное время равно 11, оно дает мне 12 (оно всегда добавляет один час к текущему системному времени).Как я мог решить эту проблему?Я хочу, чтобы дата давала мне то же время, что и системное время. Это связано с часовым поясом?Я пробовал:

Calendar startingTime = Calendar.getInstance(TimeZone.getDefault());
System.out.println(startingTime.getTime());

и

System.out.println(new Date());

Спасибо

Ответы [ 2 ]

5 голосов
/ 03 сентября 2011

Это может быть вызвано одной из двух причин:

  • Дата в базовой операционной системе неверна (но вы могли случайно настроить ее, чтобы не сказать).
  • Часовой пояс, определенный JVM, неверен (в том числе информация о переходе на летнее время может быть устаревшей).

Возможно, вы могли бы добавить выходные данные вашего new Date() вместе с информацией о том, чего вы ожидали и гдеВы?

0 голосов
/ 04 июня 2018

ТЛ; др

ZonedDateTime.now(             // Capture the current moment as seen in the wall-clock time used by the people of a certain region (time zone).
    ZoneId.of( "Asia/Gaza" )   // Specify time zone by proper IANA-defined name, never a 3-4 letter pseudo-zone such as `PST` or `CST`.
)                              // Returns a `ZonedDateTime` object.
.toString()                    // Generate a `String` to represent the value of that `ZonedDateTime`.

Подробнее

Ответ Андерсена правильный.

Вот некоторый современный код, помогающий с отладкой.

Проверка текущего момента в UTC

Относительно первой пули Андерсена ...

Проверьте, были ли часы вашего компьютера установлены неправильно или сместились. Спросите текущий момент в UTC , чтобы избежать осложнений часовых поясов.

Instant now = Instant.now() ;  // Capture current moment in UTC.

Сравните свои результаты с живым веб-сайтом, показывающим время UTC, например:

https://time.is/UTC

Если неверно, подключите компьютер к надежному серверу времени , локальному для вашей сети или через интернет.

Проверить часовой пояс по умолчанию

Относительно второй пули Андерсена ...

Проверьте текущий часовой пояс JVM по умолчанию.

ZoneId z = ZoneId.systemDefault() ;
String output = z.toString() ;

Укажите нужный часовой пояс

Если часовой пояс не указан, JVM неявно применяет свой текущий часовой пояс по умолчанию. Это значение по умолчанию может измениться в любой момент во время выполнения (!), Поэтому ваши результаты могут отличаться. Лучше указать в качестве аргумента ваш желаемый / ожидаемый часовой пояс .

Укажите собственное имя часового пояса в формате continent/region, например America/Montreal, Africa/Casablanca или Pacific/Auckland. Никогда не используйте 3-4-буквенное сокращение, например EST или IST, поскольку они не истинных часовых поясов, не стандартизированы и даже не уникальны (!).

ZoneId z = ZoneId.of( "Asia/Gaza" ) ;  
ZonedDateTime now = ZonedDateTime.now( z ) ;

Обновление tzdata

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

Большинство систем получают данные о часовых поясах из tzdata , опубликованного IANA . Эти данные ранее были известны как «База данных Олсона».

Вы должны поддерживать эти данные в актуальном состоянии, если какие-либо часовые пояса, которые вас интересуют, были изменены. Вы можете найти данные часового пояса в нескольких местах, включая

Я искал историю изменений часовых поясов в Палестине, но эта страница Википедии, Время в Государстве Палестина , является неполной и требует некоторой работы.


О 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.* классах.

Где получить классы java.time?

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

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