Определить, является ли летнее время (DST) активным в Java на указанную дату
У меня есть класс Java, который принимает широту / долготу местоположения и возвращает смещение GMT, когда летнее время включено и выключено. Я ищу простой способ определить в Java текущую дату в летнее время, чтобы я мог применить правильное смещение. В настоящее время я выполняю этот расчет только для часовых поясов США, хотя в конечном итоге мне бы хотелось расширить его и на глобальные часовые пояса.
5 ответов
Это ответ для машины, на которой задается вопрос:
TimeZone.getDefault().inDaylightTime( new Date() );
Серверу, пытающемуся выяснить это для клиента, понадобится часовой пояс клиента. Смотрите ответ @Powerlord по причине.
Для любого конкретного часового пояса
TimeZone.getTimeZone( "US/Alaska").inDaylightTime( new Date() );
ТЛ; др
ZoneId.of( "America/Montreal" )
.getRules()
.isDaylightSavings(
Instant.now()
)
java.time
Вот современная версия правильного ответа от 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
,
TimeZone tz = TimeZone.getTimeZone("EST");
boolean inDs = tz.inDaylightTime(new Date());
Вам нужно будет проделать немного больше работы с этими координатами и выяснить, в каком часовом поясе они находятся. Как только вы узнаете, что это за TimeZone, метод isDayLight() будет полезен.
Например, вы не можете определить, является ли -0500 EST (стандартное время США / Канады по восточному поясному времени), CDT (центральное дневное время США / Канады), COT (стандартное время Колумбии), AST (стандартное время Бразилии по акру), ECT (Эквадор) Время) и т.д...
Некоторые из них могут поддерживать или не поддерживать переход на летнее время.
Joda Time содержит методы обработки, которые рассчитают смещения для вас. Смотрите DateTimeZone.convertLocalToUTC(...)
Чтобы дополнить это, вам нужно посмотреть текущий часовой пояс с информацией о широте / долготе. GeoNames предоставляет Java-клиент для своего веб-сервиса, а также простую инфраструктуру веб-запросов (например, http://ws.geonames.org/timezone?lat=47.01&lng=10.2).