Обновление часового пояса Java двойными значениями - PullRequest
0 голосов
/ 23 мая 2018

У меня есть таблица с диапазоном часовых поясов страны, например

Страна: Канада Начальный диапазон: -3,5 Конечный диапазон: -8.0

У меня есть метод, который отодвигает начальный и конечный диапазонзначения из таблицы мне нужно преобразовать системное время (UTC) в диапазон времени страны.Если бы я имел дело с целыми числами, это было бы хорошо, и я просто использовал бы календарь, добавив обычные методы, которые принимают значения типа int, но мой метод возвращает удваивается

У меня есть:

private Calendar[] setCountryTime( double startRange double endRange) {
        Calendar[] clientTimeRange = null;      
        Date today = new Date(); 
        Calendar cal = Calendar.getInstance(); 
        cal.setTime(today); 

        Calendar clientStartRange = getCurrentServerTime();
            clientStartRange.add(Calendar.HOUR_OF_DAY, //what value here);
            clientStartRange.add(Calendar.MINUTE, //what value here);
        clientTimeRange[0] = clientStartRange;

        Calendar clientEndRange = getCurrentServerTime();
            clientEndRange.add(Calendar.HOUR_OF_DAY, //what value here);
            clientEndRange.add(Calendar.MINUTE, //what value here);
        clientTimeRange[1] = clientEndRange ;

        return clientTimeRange; 

    }

1 Ответ

0 голосов
/ 23 мая 2018

java.time

private static final long HOURS_TO_SECONDS = TimeUnit.HOURS.toSeconds(1);

private static OffsetDateTime[] setCountryTime(double startRange, double endRange) {
    ZoneOffset startOffset = hoursToOffset(startRange);
    ZoneOffset endOffset = hoursToOffset(endRange);
    Instant now = Instant.now();
    return new OffsetDateTime[] { now.atOffset(startOffset), now.atOffset(endOffset) };
}

private static ZoneOffset hoursToOffset(double offsetHours) {
    long offsetSeconds = Math.round(offsetHours * HOURS_TO_SECONDS);
    if (offsetSeconds < ZoneOffset.MIN.getTotalSeconds() 
            || offsetSeconds > ZoneOffset.MAX.getTotalSeconds()) {
        throw new IllegalArgumentException("Offset too large " + offsetHours);
    }
    return ZoneOffset.ofTotalSeconds((int) offsetSeconds);
}

Давайте попробуем это:

    OffsetDateTime[] canadaTimeRange = setCountryTime(-3.5, -8.0);
    System.out.println(Arrays.toString(canadaTimeRange));

Запустил только что это напечатано:

[2018-05-23T10:06: 47.489234-03: 30, 2018-05-23T05: 36: 47.489234-08: 00]

Поскольку мы можем создать экземпляр ZoneOffset за несколько секунд, основной трюк заключается вконвертировать ваши часы в секунды.Перечисление TimeUnit могло бы сделать это для вас, если бы у нас было всего несколько часов.Мы все еще можем использовать его коэффициент преобразования для умножения.Это делает наше намерение более понятным, а код - менее подверженным ошибкам.

Класс Calendar давно устарел и плохо спроектирован.Вместо этого я использую java.time, современный Java API даты и времени.Намного приятнее работать.Если вам нужны Calendar объекты, например, для устаревшего API, который вы не можете изменить, можно выполнить преобразование.

Мы все еще используем Java 7, поэтому мы используем Calendar

РЕДАКТИРОВАТЬ Нет больших проблем, java.time прекрасно работает на Java 6 и 7.

  • В Java 8 и более поздних версиях и на более новых устройствах Android (с API уровня 26 ясказал), современный API поставляется встроенным.
  • В Java 6 и 7 получите ThreeTen Backport, бэкпорт новых классов (ThreeTen для JSR 310; см. ссылки внизу).
  • На (более старой) версии Android используется версия Android ThreeTen Backport.Это называется ThreeTenABP.И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...