Почему смещение для Хартума равно 0?Есть ли ошибка в часовых поясах? - PullRequest
0 голосов
/ 13 июня 2018

Почему следующий код:

System.out.println("Khartoum offset: " + TimeZone.getTimeZone("Asia/Khartoum").getRawOffset());
// GMT+2

System.out.println("Moscow offset: " + TimeZone.getTimeZone("Europe/Moscow").getRawOffset());
// GMT+3

System.out.println("Cairo offset: " + TimeZone.getTimeZone("Africa/Cairo").getRawOffset());
// GMT+2

производит такой странный ввод:

Khartoum offset: 0, why is this 0??? It should have been 7200000
Moscow offset: 10800000 // 3 hours, which is OK for GMT+3
Cairo offset: 7200000 // 2 hours, which is OK for GMT+2

Если вы введете в Google Khartoum time, вы обнаружите, что в Хартуме GMT+2 (то же, что и "Каир").

UPD : System.out.println(TimeZone.getTimeZone("Africa/Khartoum").getRawOffset()); распечатывает 10800000, что в основном составляет GMT + 3.Не должен ли он печатать 7200000 (что соответствует GMT + 2), хотя (доказательство: что по этому поводу: ideone.com / sm2SHC )?

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

Хартум расположен в Африке, а не в Азии, и у TZDB также есть это представление , поэтому используйте:

Africa/Khartoum

В противном случае старый API часового пояса вернется к GMT.

0 голосов
/ 13 июня 2018

Если вы подозреваете, что существует другой «Хартум», например «Азия / Хартум», вы можете написать код, чтобы убрать все ваши сомнения:

String[] strings = TimeZone.getAvailableIDs();

for (String s : strings) {
    if (s.contains("Khartoum")) {
        System.out.println(s);
    }
}

Вывод (даже в Java 10)

Африка / Хартум

РЕДАКТИРОВАТЬ : так как вы предоставили код с неправильным выводом, я выложу здесь весь коднаписано.Пожалуйста, скопируйте / вставьте этот код и покажите некоторые отзывы ...

import java.util.TimeZone;

public class Answer {

    public static void main(String[] args) {

        String[] strings = TimeZone.getAvailableIDs();

        for (String s : strings) {
            if (s.contains("Khartoum")) {
                System.out.println("For " + s + " raw offset is "
                        + TimeZone.getTimeZone(s).getRawOffset());
            }
        }

    }

}

Вывод должен быть:

Для Африки / Хартума необработанное смещение составляет 7200000

0 голосов
/ 13 июня 2018

См. TimeZone.getAvailableIds() для списка поддерживаемых идентификаторов часовых поясов."Asia/Khartoum", похоже, не входит в их число.

Javadoc для TimeZone.getTimeZone(String) говорит:

Возвраты: указанная TimeZone или theGMT зона, если данный идентификатор не может быть понят .

Подробнее

С другой стороны, если вы отметите "Africa/Khartoum"

TimeZone.getTimeZone("Africa/Khartoum").getRawOffset()

возвращает 7200000 (по крайней мере, когда я попробую).

...