Определить, является ли летнее время (DST) активным в Java на указанную дату - PullRequest
52 голосов
/ 30 июня 2009

У меня есть класс Java, который принимает широту / долготу местоположения и возвращает смещение GMT, когда летнее время включено и выключено. Я ищу простой способ определить в Java текущую дату в летнее время, чтобы я мог применить правильное смещение. В настоящее время я выполняю этот расчет только для часовых поясов США, хотя в конечном итоге мне бы хотелось расширить его и на глобальные часовые пояса.

Ответы [ 5 ]

66 голосов
/ 30 июня 2009

Это ответ для машины, на которой задается вопрос:

TimeZone.getDefault().inDaylightTime( new Date() );

Серверу, пытающемуся выяснить это для клиента, потребуется часовой пояс клиента. См. Ответ @Powerlord о причине.

Для любой конкретной TimeZone

TimeZone.getTimeZone( "US/Alaska").inDaylightTime( new Date() );
26 голосов
/ 11 сентября 2015

ТЛ; др

ZoneId.of( "America/Montreal" )  // Represent a specific time zone, the history of past, present, and future changes to the offset-from-UTC used by the people of a certain region.  
      .getRules()                // Obtain the list of those changes in offset. 
      .isDaylightSavings(        // See if the people of this region are observing Daylight Saving Time at a specific moment.
          Instant.now()          // Specify the moment. Here we capture the current moment at runtime. 
      )                          // Returns a boolean.

java.time

Вот современная java.time (см. Учебник ) версия правильного ответа от mamboking .

  • A ZoneId представляет часовой пояс. Класс знает правила, которые указывают, применяется ли DST к конкретному часовому поясу .
  • Класс ZoneRules моделирует все исторические и будущие переходы для часового пояса.
  • An Instant - это момент на временной шкале в UTC .
  • A ZonedDateTime является результатом применения ZoneId к Instant.

Пример кода:

ZonedDateTime now = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) );
…
ZoneId z = now.getZone();
ZoneRules zoneRules = z.getRules();
Boolean isDst = zoneRules.isDaylightSavings( now.toInstant() );

Обратите внимание, как в последней строке нам пришлось извлечь объект Instant из нашего объекта ZonedDateTime простым вызовом toInstant.


О 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 .

10 голосов
/ 30 июня 2009
TimeZone tz = TimeZone.getTimeZone("EST");
boolean inDs = tz.inDaylightTime(new Date());
3 голосов
/ 30 июня 2009

Вам придется проделать немного больше работы, используя эти координаты, и выяснить, в каком часовом поясе они находятся. Как только вы узнаете, что это за TimeZone, метод isDayLight () будет полезен.

Например, вы не можете сказать, является ли -0500 EST (стандартное время США / Канады по восточному времени), CDT (центральное летнее время США / Канады), COT (время Колумбии), AST (стандартное время Бразилии по акру), ECT (Эквадорское время) и т.д ...

Некоторые из них могут поддерживать или не поддерживать переход на летнее время.

1 голос
/ 30 июня 2009

Joda Time содержит методы обработки, которые рассчитают смещения для вас. См. DateTimeZone.convertLocalToUTC (...)

Чтобы дополнить это, вам нужно посмотреть текущий часовой пояс с информацией о широте / долготе. GeoNames предоставляет Java-клиент для своего веб-сервиса, а также простую инфраструктуру веб-запросов (т.е. http://ws.geonames.org/timezone?lat=47.01&lng=10.2)

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