2016-11-18 7 views
0

Я вижу эту проблему при использовании экземпляра календаря для вычитания одного часа с момента завершения дневного света и перехода на стандартное время. вот код:DST issue with java Calendar

Date startTime = new Date();// Gives me Sun Nov 06 01:26:16 EST 2016 
Calendar temp; 
TimeZone timezone = TimeZone.getDefault(); //Eastern 
temp= Calendar.getInstance(timezone); 
temp.setTime(startTime); 
temp.add(Calendar.HOUR_OF_DAY, -1); 
temp.set(Calendar.MILLISECOND, 0); 
    Date endDate = temp.getTime(); // This is still Sun Nov 06 01:26:16 EST 2016 

Результат, который я ожидаю в ENDDATE Вс 6 ноября 1:26:16 EDT 2016 вместо Вс 6 ноября 1:26:16 EST 2016. Я не уверен, если это как это было разработано или нет. Если я вычитаю 2 часа, то я вижу, что он работает нормально. Любые входы на этом?

Спасибо, SS

ответ

1

Использование java.time

Вы должны использовать классы java.time, а не назойливых старых классов даты и времени, такие как Calendar, чем теперь наследие.

Обязательно прочитайте документ класса для ZonedDateTime, чтобы понять его выбор того, как обращаться с вырезами на летнее время (DST).

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

ZoneId z = ZoneId.of("America/New_York"); 
// of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond, ZoneId zone) 
ZonedDateTime zdt = ZonedDateTime.of(2016 , 11 , 6 , 1 , 26 , 16 , 0 , z); 
ZonedDateTime zdtOneHourEarlier = zdt.minusHours(1); 
ZonedDateTime zdtOneHourLater = zdt.plusHours(1); 

Обратите внимание на смещение-по-UTC в каждом результате.

zdt.toString(): 2016-11-06T01: 26: 16-04: 00 [Америка/New_York]

zdtOneHourEarlier.toString(): 2016-11-06T00: 26: 16- 4:00 [Америка/New_York]

zdtOneHourLater.toString(): 2016-11-06T01: 26: 16-05: 00 [Америка/New_York]

Смотрите этот код run live at IdeOne.com.


О 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

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