Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > как сохранить в Calendar время '02:30 29.03.2009'?


Автор: Forza 2.4.2009, 20:08
Получаю дату/время из файла в виде строки, которая, например, может выглядеть так - "2009.03.29 02:30".
Хочу преобразовать её в Date или Calendar, например:
Код

static DateFormat fileTimeFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm");
[...]
Calendar timeStampCalendar = Calendar.getInstance();
                
timeStampCalendar.setTime(fileTimeFormat.parse(stringWithTime));


Умная Джава знает, что времени 02:30 не может быть 29-го марта 2009-го года в России, и прибавляет к этому времени 1 час. Таким образом в timeStampCalendar я имею уже 3 часа 30 минут.
Как сделать, чтобы время сохранилось в Calendar, как 02:30 безо всяких изменений?
Пытался экспериментировать с TimeZone/Locale при объявлении Календаря или ДэйтФормата (см. примеры ниже - Китай выбран, т.к. у него нет перехода на летнее время) - не помогло.  smile 
Код

static DateFormat fileTimeFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm", Locale.CHINA);
[...]
Calendar timeStampCalendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));


Что ещё может помочь, кроме изменения настроек на уровне ОС?

В идеале надо иметь такой "режим", при котором перевод на летнее/зимнее время будет отсутствовать в принципе.

Автор: ivg 2.4.2009, 21:18
Код

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm");
        
        TimeZone tz = new SimpleTimeZone(TimeZone.getDefault().getRawOffset(), "MyTimeZone");
        sdf.setTimeZone(tz);
        
        Date d = sdf.parse("2009.03.29 02:30");
        System.out.println(sdf.format(d));

Автор: LSD 3.4.2009, 12:44
Как вариант, вместо:
Код

new SimpleTimeZone(TimeZone.getDefault().getRawOffset(), "MyTimeZone")

использовать
Код

TimeZone.getTimeZone("+0300")

если заранее известно и фиксировано смещение от гринвича.

Автор: Forza 3.4.2009, 16:07
Спасибо за ответы.
Когда в первый раз сам смотрел, не заметил, что можно заменить TimeZone у DateFormat (наверное, это было так потому, что у Календаря и ТаймЗона, и Локаль явно присутствовали в конструкторе, а у ДэйтФормата через конструктор можно передать только Локаль).

Кстати, мою проблему можно решить и более коротко, не создавая свою собственную TimeZone:

Код

        SimpleDateFormat fileTimeFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm");
        fileTimeFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

Автор: math64 4.4.2009, 23:50
Поскольку времени 2:30 нет, parse() должно бы выбросить исключение (если вызвано setLenient(true) или сделать тоже самое, что и при 1:90. Так что если  вводится правильное время никаких ошибок нет.
Но осенью во время перехода от летнего к зимнему времени 2:30 может быть как летним, так и зимним временем и существует потеря информации.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)