Как заменить sun.util.caldender.ZoneInfo новым API в Java - PullRequest
0 голосов
/ 13 марта 2019

Я нашел этот Api Sun.util.calendar.zoneInfo в одном из моих тестовых примеров, и когда я скомпилировал его, я получил сообщение об ошибке, в котором говорилось, что sun.util.calender.ZoneInfo является внутренним проприетарным API и может быть удален в будущем выпуске.

@Test @Ignore("This test case was previously ignore, appears incomplete")
    public void test_getTimeZoneFromTimeZoneDifferential() throws Exception {
        TimeZone customCali = DMessageFactory.getTimeZoneFromTimeZoneDifferential("110");
        System.out.println("\ncustomCali: "+customCali+"\n");
        String[] ids = TimeZone.getAvailableIDs();
        for(int i = 0; i < ids.length; i++) {
            TimeZone tz = TimeZone.getTimeZone(ids[i]);

            if(tz instanceof sun.util.calendar.ZoneInfo) {
                TimeZone realZone = ((sun.util.calendar.ZoneInfo) tz).getLastRuleInstance();
                if(realZone == null) {
                    if(tz.useDaylightTime() == customCali.useDaylightTime() &&
                       tz.getOffset(0) == customCali.getOffset(0)) {
                        System.out.println("match2: "+tz+"   "+tz.getDisplayName(true, TimeZone.SHORT));
                    }
                    //System.out.println("no real zone: "+tz);
                    continue;
                }

                if(customCali.hasSameRules(realZone)) {
                    System.out.println("match: "+realZone.getDisplayName(true, TimeZone.SHORT));
                }
                else if(realZone.getOffset(0) == customCali.getOffset(0)) {
                    //System.out.println("semi-match: "+tz);
                }
                else {
                    //System.out.println("NO-match: "+tz);
                }
            } else {
                //System.out.println("no-match: "+tz);
            }
        }

Мне действительно нужно заменить этот sun.util.calendar.ZoneInfo и добавить другой API, не нарушая его функции, пожалуйста, помогите мне с этим.

1 Ответ

1 голос
/ 13 марта 2019

tl; dr

Вместо этого используйте современные java.time классы.

Обведите все известные зоны, запросите набор правил для этой зоны, укажите момент и запросите необходимую информацию.

Instant instant = Instant.now() ;
for( ZoneId z : ZoneId.getAvailableZoneIds() )
{
    String zoneName = z.getDisplayName( TextStyle.SHORT , Locale.US ) ;

    ZoneRules rules = z.getRules() ;

    ZoneOffset offset = rules.getOffset​( instant ) ;
    int secondsOfOffset = offset.getTotalSeconds() ;

    boolean currentlyInDST = rules.isDaylightSavings( instant ) ;
    Duration amountOfCurrentDstAdjustment = rules.getDaylightSavings( instant ) ;

    …
}

sun.util.calender.ZoneInfo - поддержка реализации TimeZone (оба устарели)

Согласно этому классу JavaDoc , это просто конкретная реализация, поддерживающая класс TimeZone для JVM, предоставленных Sun.

ZoneInfo - это подкласс реализации TimeZone, который представляет смещения по Гринвичу и переходы часового пояса на летнее время.

И TimeZone, и ZoneInfo устарели.Вместо этого вы должны использовать современные java.time классы.

При сборке Java Platform Module System Oracle начал постепенно сокращать доступ кчасти их реализации Java, которые устарели или никогда не предназначались для общественного потребления.Это непрерывный процесс.Любой ваш код, вызывающий классы из различных пакетов com.sun.*, должен быть переписан для использования других классов.

java.time

TimeZone - один из ужасных классов даты и времени, включенных в самые ранние версии Java.Теперь они унаследованы несколько лет назад современными java.time классами, определенными в JSR 310.

ZoneId = часовой пояс

времязона теперь представлена ​​классом ZoneId, заменив TimeZone.История прошлых, настоящих и будущих изменений в offset-from-UTC , используемых каждым регионом в зоне, отслеживается классом ZoneRules.

tzdata

Имейте в виду, что политики во всем мире часто меняют часовые пояса.Это происходит чаще, чем вы думаете.Эти изменения отслеживаются файлом данных tzdata .Всякий раз, когда происходят изменения в зоне, которая вас волнует, вы должны обновлять этот список определения часовых поясов в ваших установках Java, вашей операционной системы, баз данных, таких как Postgres, и других библиотек, которые управляют своим собственным списком часовых поясов.

Правила зоны

Укажите правильное имя часового пояса в формате Continent/Region, например America/Montreal, Africa/Casablanca или Pacific/Auckland.Никогда не используйте 2-4 буквенные сокращения, такие как EST или IST, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).

ZoneId z = ZoneId.of( "America/Montreal" ) ;  

Получить правила этой зоны.

ZoneRules rules = z.getRules() ;

Правила зоны для Instant

Instant представляет момент в UTC, то есть момент с смещением от UTC , равным нулю часами, минутами и секундами.Указав момент, вы можете задавать вопросы о действующих правилах в то время.

Instant instant = Instant.now() ;
boolean currentlyInDST = rules.isDaylightSavings( instant ) ;
Duration amountOfCurrentDstAdjustment = rules.getDaylightSavings( instant ) ;

Циклические зоны

Вы можете повторно реализовать свой код, получив все часовые пояса, известныевнедрил tzdata , вызвав метод ZoneId.getAvailableZoneIds.Вы можете зациклить возвращенный Set.

Set< String > zones = ZoneId.getAvailableZoneIds() ;
for( String z : zones )
{
    ZoneRules rules = ZoneId.of( z ).getRules() ;
    …
}

Вы не объясняете свой код, например, что это означает:

DMessageFactory.getTimeZoneFromTimeZoneDifferential("110")

... поэтому я не могу сделать для вас больше.

Ваш код, похоже, ищет часовой пояс, который соответствует смещению от UTC (часы-минуты-секунды) и указан ли Летнее время (DST) или нет.Как обсуждалось выше, вы можете запросить ZoneRules для этой информации.


О java.time

java.timeФреймворк встроен в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация JSR 310 .

Проект Joda-Time , теперь в режиме обслуживания , рекомендует выполнить переход на классы java.time .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версией. Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

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

...