Java getTimeZone () ведет себя по-разному для разных типов входных данных

Для приведенного ниже кода я получаю разные результаты

TimeZone t = TimeZone.getTimeZone("GMT-8");  // Also tried UTC-8 and GMT-8:00
//TimeZone t = TimeZone.getTimeZone("America/Los_Angeles"); 
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
Date d = null;

Calendar c = Calendar.getInstance(t);
c.set(Calendar.MONTH, Calendar.AUGUST);
c.set(Calendar.DAY_OF_MONTH, 22);
c.set(Calendar.YEAR, 2013);
d = c.getTime();

String s = sdf.format(d);
System.out.println(s + "        " + t.inDaylightTime(d));

Выход:

08/22/2013      false

Сейчас в America / Los_Angeles указано GMT-8 / UTC-8 или PST. Но когда я меняю параметр с GMT-8 на America / Los_Angeles,

Выход:

08/22/2013      true

Нельзя использовать аббревиатуры, подобные PST, так как они устарели. Также CST может означать как центральное стандартное время, так и китайское стандартное время.

У меня есть входные данные типа -8, -9 -14 и т. Д., К которым я хочу добавить GMT / UTC, чтобы узнать, могу ли я получить активацию DST в заданную дату.

Пожалуйста, помогите мне в этом отношении.


person nixsix6    schedule 25.02.2013    source источник
comment
Разве этого не ожидали? Вы не можете гарантировать, что во всех местах по GMT-8 будет летнее время. Летнее время регулируется по-разному правительством каждой страны / штата.   -  person gerrytan    schedule 25.02.2013
comment
Java TimeZone имеет список доступных идентификаторов (getAvailableIDs ()), например America / Boise America / Cambridge_Bay, America / Chihuahua, America / Dawson_Creek America / Denver, America / Edmonton, America / Hermosillo America / Inuvik, America / Mazatlan, America / Ojinaga. Америка / Феникс, Америка / Шипрок, Америка / Йеллоунайф - случайный выбор, здесь указаны не все города (например, Бостон, Вашингтон). Итак, как мне быть уверенным в том, что я буду получать информацию о дневном свете, используя ограниченные возможности?   -  person nixsix6    schedule 25.02.2013


Ответы (2)


Результаты верны, когда вы указываете GMT со смещением, невозможно узнать, какая это страна / город, поэтому невозможно определить, активен ли Day Light Time или нет.

Таким образом, inDaylightTime() будет false для всех часовых поясов, указанных с помощью GMT и смещения.

CST в Java - это Central Standard Time, вы можете проверить себя с помощью этой строки кода:

System.out.println(TimeZone.getTimeZone("CST").getDisplayName());

China Standard Time идентификатор зоны в Java - CTT

Изменить

Рассмотрите возможность использования API времени и даты Joda для получения более свежих данных Timezone Информация

person iTech    schedule 25.02.2013
comment
TimeZone.getTimeZone (CST), который устарел. - person nixsix6; 25.02.2013
comment
Да, лучше использовать полное имя, особенно для работы inDaylightTime - person iTech; 25.02.2013
comment
Вы имеете в виду ‹i› TimeZone t = TimeZone.getTimeZone (центральное стандартное время); ? Я не думаю, что это поддерживается. - person nixsix6; 25.02.2013
comment
Нет, это не сработает, я хочу использовать полное имя зоны, например. America/Los_Angeles - person iTech; 25.02.2013
comment
позвольте нам продолжить обсуждение в чате - person nixsix6; 25.02.2013

Как объяснил @iTech, результаты верны. Чтобы добавить, вы можете найти идентификаторы часовых поясов, доступные как

import java.util.TimeZone;

public class TimeZones {
    public static void main(String[] args) {
        String[] timezones = TimeZone.getAvailableIDs();
        System.out.println(timezones.length);
        for (String t : timezones) {
            System.out.println(t);  
        }
    }
}

Это напечатает длинный список из 600 доступных часовых поясов.

Затем вы можете получить отображаемое имя для сокращенных как

System.out.println(TimeZone.getTimeZone("IST").getDisplayName());
person mtk    schedule 25.02.2013