У меня есть класс Java, который занимает широту/долготу местоположения и возвращает смещение по часовой стрелке, когда включено и выключено летнее время. Я ищу простой способ определить на Java, если текущая дата находится в летнее время, поэтому я могу применить правильное смещение. В настоящее время я выполняю этот расчет только для часовых поясов США, хотя в конечном итоге я хотел бы расширить его и на глобальные часовые пояса.
Определите, активна ли летняя экономия времени (DST) в 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?
- Java SE 8, Java SE 9, Java SE 10, Java SE 11 и более поздние версии - часть стандартного API Java со встроенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport.
- Android
- Более поздние версии Android связывают реализации классов java.time.
- Для более ранних версий Android (<26) проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше). Смотрите Как использовать ThreeTenABP….
Проект 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)