Определите, активна ли летняя экономия времени (DST) в Java для указанной даты

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

Ответ 1

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

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

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

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

TimeZone.getTimeZone( "US/Alaska").inDaylightTime( new Date() );

Ответ 2

ТЛ; др

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 (см Tutorial) версия правильного ответа по mamboking.

  • ZoneId представляет часовой пояс. Класс знает правила, которые говорят, применяется ли DST к определенному часовому поясу.
  • Класс ZoneRules моделирует все исторические и будущие переходы для часового пояса.
  • Instant - это момент времени на UTC.
  • 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 и другие.

Ответ 3

TimeZone tz = TimeZone.getTimeZone("EST");
boolean inDs = tz.inDaylightTime(new Date());

Ответ 4

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

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

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

Ответ 5

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

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