2008-11-12 13 views
5

Potrzebuję być w stanie przechowywać datę (rok/miesiąc/dzień) bez składnika czasu. To abstrakcyjna koncepcja daty, na przykład urodzin - muszę podać datę w roku, a nie konkretną chwilę w czasie.Daty bez składnika czasowego lub strefy czasowej w Java/MySQL

Używam Java do analizowania daty z tekstu wejściowego i trzeba przechowywać w bazie danych MySQL. Niezależnie od strefy czasowej, w której znajduje się baza danych, aplikacja lub dowolny klient, wszystkie powinny widzieć ten sam rok/miesiąc/dzień.

Moja aplikacja będzie działać na komputerze z inną strefą czasową systemu z serwera bazy danych, a ja nie mam nad nim kontroli. Czy ktoś ma eleganckie rozwiązanie, które zapewnia, że ​​prawidłowo przechowuję datę?

mogę myśleć o tych rozwiązań, z których żadna nie wydaje się bardzo ładny:

  • Query mojego połączenia MySQL dla swojej strefy czasowej i analizowania datę wejścia w tej strefie czasowej
  • Process data całości jako yyyy smyczkową -MM-dd

Odpowiedz

2

doszedłem do wniosku, że najlepszym sposobem, w moim bieżącej aplikacji (proste narzędzie, za pomocą JDBC bezpośrednio) było wstawić bezpośrednio jako ciąg znaków. W przypadku większej aplikacji Hibernate mogę zadać sobie trud napisania własnego typu użytkownika. Nie mogę uwierzyć, że ktoś jeszcze nie rozwiązał tego problemu w jakimś publicznie dostępnym kodzie ...

+0

Tak, w kodzie Java utwórz własny typ dat lub po prostu użyj ciągu znaków. Obiekt java.util.Date jest określony w czasie i nie modeluje poprawnie przypadku użycia. – erickson

+0

Mam podobny przypadek użycia: dowolną datę niezależną od roku, w której koreluję moje dane z danymi sezonowymi. Przechowywałam miesiąc i dzień jako liczby całkowite, zamiast używać ciągu znaków, i nie przechowuję żadnej reprezentacji roku. – AjahnCharles

2

można wyzerować wszystkie rzeczy razem/Strefa czasowa:

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

Nie można po prostu użyć typu MySQL DATE w tabeli, a następnie użyć sformatowanego ciągu w instrukcji wstawiania? Pomyślałbym, że coś takiego pozwoliłoby uniknąć jakichkolwiek korekt strefy czasowej.

INSERT INTO time_table(dt) VALUES('2008-12-31') 
+0

Witaj, luka w zabezpieczeniach SQL injection! –

0

Ponieważ określasz, że twój serwer i db znajdują się w różnych strefach czasowych, wydaje mi się, że masz problem z interpretacją. Jeśli wyzerujesz datę lub przechowujesz ją jako MM-dd-RRRR, co oznacza to samo, czy przechowujesz datę serwera lub datę db? Jeśli jest godzina 23:00 na serwerze i 1:00 następnego dnia w bazie danych, która data jest "właściwa"? Kiedy spojrzysz na daty za rok, zapamiętasz, które strefy czasowe maszyn zależą od dat?

Te rozważania mogą być nieco przesadą. Ale dlaczego nie zapisać dat w GMT (wyzerować sekundy, jeśli chcesz)?

+0

Pytający nie chciał zapisać konkretnej instancji czasu, tylko datę. Data urodzenia w tym przypadku. Strefa czasowa staje się nieistotna, tylko wtedy, gdy analizowana jest lokalna strefa czasowa. Ustawienie strefy czasowej na UTC/GMT jest właściwie tym samym. Więc nie widzę jak .. żadnego punktu w twojej odpowiedzi. Czy coś przeoczyłem? Czuję, że muszę, ponieważ prawdopodobnie jesteś tysiąc razy bardziej doświadczony niż ja. –

0

Klasa java.sql.Date istnieje dokładnie z tego powodu, niestety jest bardzo niewygodna w obsłudze, ponieważ po prostu rozciąga się na java.util.Date i ręcznie trzeba ustawić część czasu na zero.

Powiązane problemy