Mysql
 sql >> Baza danych >  >> RDS >> Mysql

JPA Zapisywanie błędnej daty w bazie danych MySQL

tl;dr

Użyj JPA 2.2 za wsparcie java.time .

Użyj klasy zawierającej tylko datę w Javie, aby pracować z wartościami zawierającymi tylko datę w SQL.

LocalDate                           // Represent a date-only, without a time-of-day and without a time zone.
.now(                               // Get today's date…
    ZoneId.of( "Africa/Tunis" )     // …as seen in the wall-clock time used by the people of a particular region.
)                                   // Returns a `LocalDate` object.
.plusMonths( 1 )                    // Returns another `LocalDate` object, per immutable objects pattern.

java.time

JPA 2.2 obsługuje teraz nowoczesny java.time zajęcia. Nie ma już potrzeby korzystania z Joda-Time.

Nie nie użyj java.sql.Date . Te zajęcia udają do reprezentowania tylko daty, ale w rzeczywistości ma ustawiony czas na UTC z powodu okropnej decyzji projektowej o dziedziczeniu po java.util.Date (która pomimo nazwy reprezentuje datę i pora dnia i przesunięcie o zero dla samego UTC). Te starsze klasy to okropny bałagan. Sun, Oracle i społeczność JCP zrezygnowały z zajęć z tych zajęć lata temu wraz z przyjęciem JSR 310, i ty też powinieneś.

LocalDate

LocalDate klasa reprezentuje wartość zawierającą tylko datę bez pory dnia i bez strefy czasowej lub przesunięcie-od-UTC .

Strefa czasowa ma kluczowe znaczenie przy ustalaniu daty. W dowolnym momencie data różni się na całym świecie w zależności od strefy. Na przykład kilka minut po północy w Paryżu Francja to nowy dzień, ale wciąż „wczoraj” w Montréal Québec .

Jeśli nie określono strefy czasowej, maszyna JVM niejawnie stosuje swoją bieżącą domyślną strefę czasową. Ta wartość domyślna może zmiana w dowolnym momencie w czasie działania(!), więc wyniki mogą się różnić. Lepiej określić żądaną/oczekiwaną strefę czasową jako argument. Jeśli jest to krytyczne, potwierdź strefę z użytkownikiem.

Podaj właściwą nazwę strefy czasowej w formacie Kontynent/Region , na przykład Ameryka/Montreal , Afryka/Casablanca lub Pacyfik/Auckland . Nigdy nie używaj 2-4-literowego skrótu, takiego jak EST lub IST ponieważ oni nie prawdziwe strefy czasowe, nieustandaryzowane, a nawet nie unikalne(!).

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

Jeśli chcesz użyć bieżącej domyślnej strefy czasowej JVM, poproś o nią i przekaż jako argument. Jeśli zostanie pominięty, kod staje się niejednoznaczny, ponieważ nie wiemy na pewno, czy zamierzałeś użyć domyślnego, czy też, podobnie jak wielu programistów, nie wiedziałeś o problemie.

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

Lub podaj datę. Możesz ustawić miesiąc według liczby, z rozsądną numeracją 1-12 dla stycznia-grudnia.

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.

Lub lepiej użyj Miesiąc predefiniowane obiekty wyliczeniowe, po jednym na każdy miesiąc w roku. Wskazówka:użyj tych miesiąca obiekty w całej bazie kodu, a nie tylko liczbę całkowitą, aby Twój kod był bardziej samodokumentowany, zapewniał prawidłowe wartości i zapewniał Bezpieczeństwo typu . To samo dla Rok &RokMiesiąc .

LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;

Matematyka data-czas

Najwyraźniej chcesz zacząć od jednej daty i otrzymać jeden miesiąc później jako zakres dat.

LocalDate monthLater = ld.plusMonths( 1 ) ;

JDBC 4.2

Od JDBC 4.2 sterownik JDBC jest wymagany do obsługi niektórych kluczy java.time klasy takie jak LocalDate .

Zakres dat

Zwróć uwagę na poniższe linki do ThreeTen-Extra . Możesz znaleźć LocalDateRange klasę, która będzie przydatna, jeśli dużo pracujesz z zakresami dat.

O java.time

java.time Framework jest wbudowany w Javę 8 i nowsze. Te klasy zastępują kłopotliwe stare dziedzictwo klasy daty i godziny, takie jak java. util.Data , Kalendarz , &SimpleDateFormat .

Aby dowiedzieć się więcej, zobacz Samouczek Oracle . I przeszukaj Stack Overflow, aby znaleźć wiele przykładów i wyjaśnień. Specyfikacja to JSR 310 .

Joda-Time projekt, teraz w trybie konserwacji , zaleca migrację do java.time zajęcia.

Możesz wymienić java.time obiekty bezpośrednio z bazą danych. Użyj sterownika JDBC zgodny z JDBC 4.2 lub później. Nie potrzeba ciągów, nie potrzeba java.sql.* zajęcia.

Skąd wziąć zajęcia java.time?

ThreeTen-Extra projekt rozszerza java.time o dodatkowe zajęcia. Ten projekt jest poligonem doświadczalnym dla możliwych przyszłych dodatków do java.time. Możesz znaleźć kilka przydatnych klas, takich jak Przedział , YearWeek , YearQuarter i więcej .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy możemy zaimportować SQL z wiadra S3 do AWS ec2 (instancja)?

  2. Migracja bazy danych Oracle do MySQL na AWS, część 2

  3. Używanie php filter_var z mysql_real_escape_string

  4. MySQL GROUP BY i wypełnianie pustych wierszy

  5. W MySQL:Jak przekazać nazwę tabeli jako procedurę składowaną i/lub argument funkcji?