Часовой пояс Java - странное поведение с IST?

У меня есть код ниже:

DateFormat df = new SimpleDateFormat("M/d/yy h:mm a z");
df.setLenient(false);
System.out.println(df.parse("6/29/2012 5:15 PM IST"));

Предполагая, что я теперь установил часовой пояс моего компьютера на Тихоокеанское время (UTC-7 для PDT), это напечатает

Fri Jun 29 08:15:00 PDT 2012

Разве PDT на 12,5 часа не отстает от IST (индийского стандартного времени)? Эта проблема не возникает для любого другого часового пояса - я попробовал UTC, PKT, MMT и т. Д. Вместо IST в строке даты. Есть ли в Java два IST случайно?

P.S: Строка даты в фактическом коде взята из внешнего источника, поэтому я не могу использовать смещение по Гринвичу или любой другой формат часового пояса.

 Vasan29 июн. 2012 г., 17:41
@biziclop Я думал об этом. Но что отвлекло меня от этого было следующее:System.out.println(TimeZone.getTimeZone("IST").getRawOffset()); Это печатает 19800000, или 5,5 часов, что говорит о том, что это действительно индийское стандартное время. Или он выбирает первый из множества часовых поясов с тем же идентификатором «IST»? Если так, как может быть что-то вроде «идентификатора»? если это то же самое для многих вещей?
 biziclop29 июн. 2012 г., 17:38
Насколько я знаю, есть несколько IST. Судя по разнице во времени (9 часов), у вас, вероятно, есть стандартное время Израиля.
 biziclop29 июн. 2012 г., 17:52
@Vasan это не совсем удостоверение личности иSimpleDateFormat странный зверь, очень вероятно, что он не используетTimeZone.getTimeZone() совсем.
 biziclop29 июн. 2012 г., 17:43
@esej Скорее всего, будет неопределенность в сокращениях часовых поясов:en.wikipedia.org/wiki/List_of_time_zone_abbreviations
 assylias29 июн. 2012 г., 17:50
Глядя наsource code кажется, что IST это Индия ...

Ответы на вопрос(4)

Решение Вопроса

Извините, я должен написать ответ для этого, но попробуйте этот код:

public class Test {

    public static void main(String[] args) throws ParseException {
        DF df = new DF("M/d/yy h:mm a z");
        String [][] zs = df.getDateFormatSymbols().getZoneStrings();
        for( String [] z : zs ) {
            System.out.println( Arrays.toString( z ) );
        }
    }

    private static class DF extends SimpleDateFormat {
        @Override
        public DateFormatSymbols getDateFormatSymbols() {
            return super.getDateFormatSymbols();
        }

        public DF(String pattern) {
            super(pattern);
        }
    }

}

Вы обнаружите, что IST появляется в списке несколько раз, и первым действительно является стандартное время Израиля.

 29 июн. 2012 г., 20:06
@Vasan Ну, DateFormat здесь не единственный виновник, основная проблема в том, что акронимы часовых поясов не уникальны. Оглядываясь назад, это была глупая идея. :)
 Vasan29 июн. 2012 г., 18:16
Спасибо, это очень полезно. Тогда я полагаю, что мне нужно сделать что-то странное, например удалить временную зону из строки даты перед ее анализом. Затем часть часового пояса, которую я могу передать TimeZone.getTimeZone (), чтобы получить фактический часовой пояс (я полагаю, даже тот, который не гарантирован, будет работать всегда!). Теперь все становится клочковатым, черт возьми, DateFormat!

Не ответ, но посмотрите вывод + код ниже - кажется, чтоparse относится к IST иначеTimeZone.getTimeZone("IST")...

Fri Jun 29 16:15:00 BST 2012
Fri Jun 29 12:45:00 BST 2012
Fri Jun 29 12:45:00 BST 2012
*BST = London

public static void main(String[] args) throws InterruptedException, ParseException {
    DateFormat fmt1 = new SimpleDateFormat("M/d/yy h:mm a Z");
    Date date = fmt1.parse("6/29/2012 5:15 PM IST");
    System.out.println(date);

    DateFormat fmt2 = new SimpleDateFormat("M/d/yy h:mm a");
    fmt2.setTimeZone(TimeZone.getTimeZone("IST"));
    System.out.println(fmt2.parse("6/29/2012 5:15 PM"));

    DateFormat fmt3 = new SimpleDateFormat("M/d/yy h:mm a");
    fmt3.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata"));
    System.out.println(fmt3.parse("6/29/2012 5:15 PM"));
}
 29 июн. 2012 г., 18:07
Да, это именно то, что я сказал.SimpleDateFormat странный зверь и не играет по правилам. Он имеет свой собственный массив данных о часовых поясах и использует все, что находится в нем первым.

Это потому, что IST будет иметь несколько значений, таких как ирландское стандартное время, исреальное стандартное время, индийское стандартное время.

Ref:https://www.timeanddate.com/time/zones/

Используйте метод setTimezone () специально для установки часового пояса.

Пример: parser.setTimeZone (TimeZone.getTimeZone (& quot; подробно указывать часовой пояс здесь & quot;));

Сокращенные названия часовых поясов неоднозначны и устарели для названий Олсона для часовых поясов. Следующее работает согласованно, поскольку могут быть различия в поведении parse () и getTimezone ().

SimpleDateFormat sdf = new SimpleDateFormat("M/d/yy h:mm a Z");
TimeZone istTimeZone = TimeZone.getTimeZone("Asia/Kolkata");
Date d = new Date();
sdf.setTimeZone(istTimeZone);
String strtime = sdf.format(d);

Ваш ответ на вопрос