2016-10-28 2 views
0

У меня есть Java-программа, которая извлекает данные с сервера и работает 24/7. Я обнаружил, что он не меняет дату, когда он обновляет данные об извлечении. Например, если я открываю его на 10/28/2016 и запуститьПочему мои дни не меняются, если программа работает за ночь?

Date todayDT = new Date(); 
String todayD = dFormat.format(todayDT); 

он покажет 10/28/2016. После полуночи переходит на следующий день, и это снова повторится, оно все равно покажется 10/28/2016, а не 10/29/2016. Какова причина этого?

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

+4

Вы также вызываете 'new Date()' на следующий день? – SMA

+1

В каком часовом поясе вы находитесь? –

+0

Где он извлекает данные с сервера времени? –

ответ

1

TL; др

LocalDate.now(ZoneId.of("America/Montreal")) 

часового пояса

В любой данный момент, дата изменяется по всему миру от временной зоны. Например, в полдень в Окленде NZ он все еще «вчера» в Монреале Квебеке.

Хотя дата может перевернуться в часовом поясе вашего разума, дата может быть «вчера» в часовом поясе JVM.

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

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

LocalDate

Вы используете хлопотно старые классы даты и времени, теперь наследство, вытесняли классами java.time.

Класс LocalDate представляет собой значение только для даты без времени суток и без часового пояса.

ZoneId z = ZoneId.of("America/Montreal"); 
LocalDate today = LocalDate.now(z); 

Объекты даты не обновляются автоматически с помощью часов. Каждый раз, когда вы хотите проверить дату, вы должны снова позвонить LocalDate.of, чтобы сгенерировать новый объект с датой, как это было в тот момент создания.


О java.time

java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time, теперь в maintenance mode, советует перейти на java.time.

Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: JSR 310.

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

  • Java SE 8 и SE 9, а затем
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport.
  • Android
    • Проект ThreeTenABP адаптирует ThreeTen-Backport (как упоминалось выше) для Android специально.
    • См. How to use….

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

Смежные вопросы