Вопрос по timezone, java – Часовой пояс Java - странное поведение с IST?

3

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

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: Строка даты в фактическом коде взята из внешнего источника, поэтому я не могу использовать смещение по Гринвичу или любой другой формат часового пояса.

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

Ваш Ответ

4   ответа
0

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

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

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

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

9

Сокращенные названия часовых поясов неоднозначны и устарели для названий Олсона для часовых поясов. Следующее работает согласованно, поскольку могут быть различия в поведении 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);
4

Не ответ, но посмотрите вывод + код ниже - кажется, что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"));
}
Да, это именно то, что я сказал.SimpleDateFormat странный зверь и не играет по правилам. Он имеет свой собственный массив данных о часовых поясах и использует все, что находится в нем первым.
6

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

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 появляется в списке несколько раз, и первым действительно является стандартное время Израиля.

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

Похожие вопросы