Как работает свидание в Java? - PullRequest
1 голос
/ 13 августа 2011

Привет, у меня есть следующий код:

public Date convertFromGMTToLocal(Date date) {
     return new Date(date.getTimezoneOffset() + newOffset*60*1000);  
}

public Date convertFromLocalToGMT(Date date) {
    return new Date(date.getTime() - date.getTimezoneOffset()*60*1000);
}

convertFromLocalToGMT должен убрать информацию о часовом поясе, а convertFromGMTToLocal должен вернуть информацию о часовом поясе. Я понимаю, что java.util.Date представляет время в эпоху и всегда в GMT, однако при отображении даты по умолчанию используется часовой пояс JVM по умолчанию.

Пояснение, которое я получил, было то, что если ваш часовой пояс CST, а это 10:00 AM CST, вы меняете часовой пояс на GMT с convertFromLocalToGMT, так что вы по сути добавляете смещение, чтобы получить GMT, чтобы вы получили 4:00 AM CST (смещение - 6) и с помощью convertFromGMTToLocal преобразует этот объект Date обратно в 10:00 AM, независимо от ваших часовых поясов (самая запутанная часть как?). Как работает выше? Я в замешательстве ...

Спасибо.

Ответы [ 2 ]

7 голосов
/ 13 августа 2011

Вы должны в значительной степени никогда добавить смещение к Date, чтобы создать другое Date - вы бы только сделали бы это, если бы получили поврежденные данные, чтобы начать с .

Вы должны не использовать этот код. Это плохой код, который пытается обработать java.util.Date таким образом, для которого он не предназначен. Если вы хотите представить дату в определенном часовом поясе, используйте Calendar (urgh) или far лучше Joda Time API.

В частности, полученный вами код будет , а не работать с переходами часового пояса - потому что смещение в date.getTimeZoneOffset() все еще считает date UTC (потому что это то, что он определил) даже вы рассматриваете как местную дату / время.

Игнорировать значение, отображаемое Date.toString() - избегайте использования этого метода. Либо отображайте с использованием SimpleDateFormat с соответствующими настройками для часового пояса, который вас интересует, либо (лучше, опять же) используйте класс Joda DateTimeFormat.

1 голос
/ 13 августа 2011

Как вы сказали, объект Date не заботится о часовом поясе.Он хранит момент во времени.Часовой пояс имеет смысл только тогда, когда вы хотите отобразить дату.Используйте DateFormat с конкретным часовым поясом, который хотите использовать для отображения даты (используя setTimeZone )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...