Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как сохранить в Calendar время '02:30 29.03.2009'? если с 02:00 до 03:00 был перевод часов 
V
    Опции темы
Forza
Дата 2.4.2009, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 12.9.2004

Репутация: нет
Всего: 2



Получаю дату/время из файла в виде строки, которая, например, может выглядеть так - "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"));


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

В идеале надо иметь такой "режим", при котором перевод на летнее/зимнее время будет отсутствовать в принципе.
PM MAIL   Вверх
ivg
Дата 2.4.2009, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 33
Всего: 81



Код

        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));

PM MAIL   Вверх
LSD
Дата 3.4.2009, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Как вариант, вместо:
Код

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

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

TimeZone.getTimeZone("+0300")

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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Forza
Дата 3.4.2009, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 12.9.2004

Репутация: нет
Всего: 2



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

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

Код

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

PM MAIL   Вверх
math64
Дата 4.4.2009, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Поскольку времени 2:30 нет, parse() должно бы выбросить исключение (если вызвано setLenient(true) или сделать тоже самое, что и при 1:90. Так что если  вводится правильное время никаких ошибок нет.
Но осенью во время перехода от летнего к зимнему времени 2:30 может быть как летним, так и зимним временем и существует потеря информации.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1031 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.