Преобразуйте строку в java.util.date И сохраните информацию о часовом поясе

Прежде чем кто-либо проголосует против этого вопроса, я просмотрел Интернет и StackOverflow, чтобы узнать о ситуации, с которой столкнулся, и ничего не нашел, поэтому пишу как новый вопрос.

У меня ситуация с датой и часовыми поясами Java.

Ситуация:

Есть 2 сервера в 2 разных часовых поясах, скажем, PST и CST. Я получаю dateString (дата в виде строки) с этих серверов. Но когда я пытаюсь преобразовать строку обратно в дату, используя SimpleDateFormat, информация о дате (год, месяц, день, часы, минуты, секунды) преобразуется правильно. Но информация о часовом поясе не сохраняется.

Если я запускаю свой код на сервере в EST, pstDateString преобразуется в формат даты, но для часового пояса устанавливается значение EDT вместо PST.

Я думал об этом по-разному, но, может быть, я напряжен, я не могу найти решение. Любая помощь ?

Блок кода, который бы имитировал ситуацию:

        DateFormat outDF1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:SS");
        outDF1.setTimeZone(TimeZone.getTimeZone("PST"));        
        String pstDateString = outDF1.format(new Date());

        DateFormat outDF2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:SS");
        outDF2.setTimeZone(TimeZone.getTimeZone("CST"));
        String cstDateString = outDF2.format(new Date());

        System.out.println("pstDateString "+pstDateString);
        System.out.println("cstDateString "+cstDateString);

        Date cstDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:SS").parse(cstDateString);
        Date pstDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:SS").parse(pstDateString);

        System.out.println("Date after format from string: "+pstDate);
        System.out.println("Date after format from string: "+cstDate);

Вывод в настоящее время:

pstDateString 2012-06-07 10:26:689
cstDateString 2012-06-07 12:26:694
Date after format from string: Thu Jun 07 10:26:00 EDT 2012
Date after format from string: Thu Jun 07 12:26:00 EDT 2012

Ожидаемый результат:

pstDateString 2012-06-07 10:26:689
cstDateString 2012-06-07 12:26:694
Date after format from string: Thu Jun 07 10:26:00 PST 2012
Date after format from string: Thu Jun 07 12:26:00 CST 2012

person Sunil    schedule 07.06.2012    source источник
comment
возможный дубликат преобразования даты в строку и обратно в дату в Java   -  person jmj    schedule 07.06.2012
comment
НЕТ, это не та ситуация.   -  person Sunil    schedule 07.06.2012
comment
Возможно, вы захотите взглянуть на библиотеку времени Joda, которая обрабатывает множество комбинаций даты, времени, часового пояса. Или вы можете сохранить все время по Гринвичу и отображать то, что предпочитает пользователь или интерфейс. то есть исходный часовой пояс не должен иметь значения.   -  person Peter Lawrey    schedule 07.06.2012
comment
Кстати, секунды — это строчные буквы s в SimpleDateFormat, а прописные буквы S — это миллисекунды.   -  person Tom Anderson    schedule 07.06.2012


Ответы (1)


класс java.util.Date не имеет часового пояса, он всегда в формате UTC. если вы хотите сохранить входящий часовой пояс, вам понадобится новый класс, который объединяет Date и TimeZone. вы можете создать простой класс держателя или, возможно, использовать календарь.

person jtahlborn    schedule 07.06.2012
comment
Я больше думал о создании объекта домена с информацией о dateString и часовом поясе и передаче его. Это разумный подход? - person Sunil; 07.06.2012
comment
конечно, хотя я не знаю, почему вы должны хранить дату как строку вместо даты (которая, по сути, длинная). - person jtahlborn; 07.06.2012
comment
Хотел бы я изменить это! Разработчик, который все это делал, сейчас в отпуске, а мне пора исправлять этот баг :) - person Sunil; 07.06.2012
comment
@codezilla - но, если вы управляете объектом домена (в конце концов, вы его создаете), разве у вас нет возможности выбрать дату или строку? если вы держите как строку, вам нужно будет повторно анализировать каждый раз перед форматированием. - person jtahlborn; 07.06.2012
comment
да... я очищаю все ненужные преобразования и поддерживаю общее состояние - person Sunil; 07.06.2012