Даты без компонента времени или часового пояса в Java / MySQL - PullRequest
5 голосов
/ 13 ноября 2008

Мне нужно иметь возможность хранить дату (год / месяц / день) без компонента времени. Это абстрактное понятие даты, например дня рождения - мне нужно представлять дату в году, а не в конкретный момент времени.

Я использую Java для анализа даты из некоторого входного текста, и мне нужно сохранить в базе данных MySQL. Независимо от того, в каком часовом поясе находится база данных, приложение или любой другой клиент, все они должны видеть один и тот же год / месяц / день.

Мое приложение будет работать на компьютере с системным часовым поясом, отличным от сервера базы данных, и я тоже не могу его контролировать. У кого-нибудь есть элегантное решение для обеспечения правильного хранения даты?

Я могу думать об этих решениях, ни одно из которых не кажется очень хорошим:

  • Запросить у моего MySQL-соединения его часовой пояс и проанализировать введенную дату в этом часовом поясе
  • Обрабатывать дату полностью как строку гггг-ММ-дд

Ответы [ 5 ]

2 голосов
/ 15 ноября 2008

Я пришел к выводу, что лучший способ в моем текущем приложении (простая утилита, использующая напрямую jdbc) - это вставить напрямую в виде строки. Для более крупного приложения Hibernate я мог бы написать свой собственный тип пользователя. Не могу поверить, что кто-то еще не решил эту проблему в общедоступном коде, хотя ...

2 голосов
/ 13 ноября 2008

Вы можете обнулить все время / часовой пояс:

public static Date truncateDate(Date date)
    {
        GregorianCalendar cal = getGregorianCalendar();
        cal.set(Calendar.ZONE_OFFSET, 0); // UTC
        cal.set(Calendar.DST_OFFSET, 0); // We don't want DST to get in the way.

        cal.setTime(date);
        cal.set(Calendar.MILLISECOND, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.HOUR, 0);
        cal.set(Calendar.AM_PM, Calendar.AM);

        return cal.getTime();
    }
0 голосов
/ 08 января 2009

Класс java.sql.Date существует именно по этой причине, к сожалению, его очень неудобно использовать, поскольку он просто расширяет java.util.Date и вам нужно вручную установить временную часть на ноль.

0 голосов
/ 15 ноября 2008

Поскольку вы указываете, что ваш сервер и база данных находятся в разных часовых поясах, мне кажется, что у вас есть проблемы с интерпретацией. Если вы обнулите дату или сохраните ее как MM-dd-YYYY, что равносильно тому, сохраняете ли вы дату сервера или дату в БД? Если это 23:00 на сервере и 1:00 следующего дня на БД, какая дата является «правильной»? Когда вы посмотрите на даты через год, вспомните ли вы, от каких часовых поясов машин зависят даты?

Эти соображения могут быть немного излишними. Но почему бы просто не хранить даты в GMT (обнулять секунды, если хотите)?

0 голосов
/ 13 ноября 2008

Не могли бы вы просто использовать тип MySQL DATE в своей таблице, а затем по существу использовать отформатированную строку в вашем операторе вставки? Я думаю, что что-то вроде этого позволит избежать любых настроек часового пояса.

INSERT INTO time_table(dt) VALUES('2008-12-31')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...