Как сделать Date независимым от локали? - PullRequest
4 голосов
/ 23 апреля 2010

У меня есть БД, которая хранит даты в формате OleDateTime в часовом поясе GMT. Я реализовал класс, расширяющий Date в Java, чтобы представить его в классическом формате даты. Но мой класс зависит от региона (я в GMT + 2). Следовательно, он преобразует дату в БД как date - 2 hours. Как мне заставить его правильно конвертировать дату? Я хочу, чтобы мой класс не зависел от локали и всегда использовал часовой пояс GMT. Собственно, вопрос такой:

class MyOleDateTime extends Date {

    static {
        Locale.setDefault(WhatGoesHere?)
    }

    // ... some constructors
    // ... some methods
}

Ответы [ 5 ]

7 голосов
/ 23 апреля 2010

Что ж, лучше использовать объект Calendar, как предложено в других ответах. Однако, если вы действительно хотите установить глобальный часовой пояс, вы можете использовать TimeZone.setDefault(TimeZone.getTimeZone("UTC")); в начале кода приложения. Существует также user.timezone системное свойство Java.

Кроме того (просто интересно знать), похоже, что единственная страна, фактически живущая по времени по Гринвичу / UTC (без изменения летнего времени), это Либерия.

Фактически, Date объекты сами по себе всегда не зависят от локали и часового пояса. Его метод getTime() всегда возвращает количество миллисекунд, прошедших с 1 января 1970 года 00:00:00 (без учета високосных секунд) в UTC . Но если вы хотите получить что-то еще, кроме миллисекунд, вы должны использовать Calendar, что зависит от часового пояса . Но это правильный путь. Вы не используете эти устаревшие методы в Date классе, не так ли?

6 голосов
/ 23 апреля 2010

Как уже сказал Майкл Боргвардт, объект Java Date ничего не знает о часовых поясах.Это просто оболочка на несколько миллисекунд с 01-01-1970 00:00:00 UTC.

Вы начинаете работать с часовыми поясами только тогда, когда, например, конвертируете объект Date в StringDateFormat.Вы устанавливаете часовой пояс на DateFormat, чтобы указать, в каком часовом поясе вы хотите видеть Date.

DateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss Z");
df.setTimeZone(TimeZone.getTimeZone("UTC"));

String text = df.format(date);  // text will contain date represented in UTC
2 голосов
/ 23 апреля 2010

A Дата не зависит от локали, всегда используя часовой пояс GMT. Это просто обертка вокруг отметки времени в миллисекундах по Гринвичу (точнее, по UTC).

Единственные вещи в Date, которые зависят от часового пояса, - это устаревшие методы, такие как getDay() - поэтому они и устарели. Те используют часовой пояс по умолчанию. Правильнее всего избегать использования этих устаревших методов - , а не для установки часового пояса по умолчанию на UTC! Это может вызвать проблемы в другом месте, и вы не можете помешать другим частям кода установить часовой пояс по умолчанию на что-то другое.

0 голосов
/ 17 июня 2013

Вот фрагмент, который я использовал для вычисления смещения GMT от экземпляра Calendar и его форматирования.Я ценю всю помощь, которую я получил от этого сайта, приятно внести свой вклад.Я надеюсь, что это кому-то поможет.Наслаждайтесь.

Calendar calInst = Calendar.getInstance();

//calculate the offset to keep calendar instance GMT
int gmtOffsetMilli = calInst.get(Calendar.ZONE_OFFSET);
long gmtOffsetHr = TimeUnit.HOURS.convert(gmtOffsetMilli, TimeUnit.MILLISECONDS);

calInst = Calendar.getInstance(TimeZone.getTimeZone("GMT " + gmtOffsetHr));
0 голосов
/ 23 апреля 2010

Использовать Календарь Объект:

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"),
                                    locale);
...