Вопрос по java – Определить, является ли летнее время (DST) активным в Java на указанную дату

51

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

stackoverflow.com/questions/10545960/… user4761989
В настоящее время я получаю информацию о часовом поясе, используя библиотеку GeoTools и шейп-файл, предоставленный Национальным атласом США (nationalatlas.gov/mld/timeznp.html). К счастью, это дает мне некоторую дополнительную информацию - прежде всего символ часового пояса, который состоит из 2 или 4 цифр (то есть AL, EA, EAno и т. Д.). К сожалению, это значение не соответствует тем, которые используются часовыми поясами Java, хотя я мог бы выполнить это отображение вручную. В идеале мне бы хотелось решение, которое работало бы, если бы я заменил этот файл шейп-файлом мирового часового пояса, но это могло бы быть слишком амбициозным. gelgamil
timeznp020.txt спискиEnumerated_Domains, которые включают в себя детали каждой используемой аббревиатуры; не должно быть слишком сложно сопоставить их с именами часовых поясов zoneinfo. Я не уверен, являются ли имена часовых поясов в Java кроссплатформенными, но я надеюсь, что это так! tc.
другой ответ, который полезен для этой проблемыstackoverflow.com/a/1449510/311525 Scott

Ваш Ответ

5   ответов
1

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

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

Error: User Rate Limit Exceeded gelgamil
10
TimeZone tz = TimeZone.getTimeZone("EST");
boolean inDs = tz.inDaylightTime(new Date());
Error: User Rate Limit Exceeded
23
tl;dr
ZoneId.of( "America/Montreal" )
      .getRules()
      .isDaylightSavings( 
          Instant.now() 
      )
java.time

java.time (увидетьРуководство) версияправильный ответ отmamboking.

A ZoneId represents a time zone. The class knows the rules that tell if DST applies to a particular time zone. The ZoneRules class models all the historic and future transitions for a time-zone. An Instant is a moment on the timeline in UTC. A ZonedDateTime is the result of applying a ZoneId to an 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.

About java.time

java.time фреймворк встроен в Java 8 и выше. Эти классы вытесняют хлопотное староенаследие классы даты и времени, такие какjava.util.Date, Calendar& amp;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, and later - Part of the standard Java API with a bundled implementation. Java 9 adds some minor features and fixes. Java SE 6 and Java SE 7 Most of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport. Android Later versions of Android bundle implementations of the java.time classes. For earlier Android (<26), the ThreeTenABP project adapts ThreeTen-Backport (mentioned above). See How to use ThreeTenABP….

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededjava.timeError: User Rate Limit ExceededThreeTen-BackportError: User Rate Limit ExceededThreeTen-ABPError: User Rate Limit Exceededjava.timeError: User Rate Limit Exceeded
63

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

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

Для любого конкретного часового пояса

TimeZone.getTimeZone( "US/Alaska").inDaylightTime( new Date() );
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
3

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

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

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

Похожие вопросы