2017-03-03 1 views
1
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); 
cal.set(1976, 8, 18, 5, 30, 0); 
java.util.Date dt = cal.getTime(); 
//use jdbc to persist this to mysql 

Wenn wir abfragen, wieder den Wert von MySQL MySQL, erhalten wir das Datum (Beachten Sie die zusätzliche Sekunde): 1976.08.18 05 30:java.util.Calendar Set mit null Sekunden andauert über jdbc mit 1 Sekunde

nach einem jdbc Logging-Treiber p6spy (https://github.com/p6spy) konnten wir von diesem Protokoll sehen, dass die Insert-Anweisung richtig die Sekunden auf Null gesetzt hatte.

Warum wird eine zusätzliche Sekunde hinzugefügt? Hinweis: Dies passiert nicht jedes Mal. Tatsächlich passiert es ungefähr die Hälfte der Zeit.

Antwort

2

Die Lösung ist, einen Anruf hinzuzufügen, um die Millisekunden einzustellen:

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); 
cal.set(1976, 8, 18, 5, 30, 0); 
cal.set(Calendar.MILLISECOND, 0); 
java.util.Date dt = cal.getTime(); 
//use jdbc to persist this to mysql 

Kurz gesagt, die Millisekunden gerundet werden nach oben, entweder durch den Fahrer oder durch mysql selbst. Wenn Sie Calendar.getInstance() sagen, erhalten Sie eine Instanz, die mit der aktuellen Zeit einschließlich Millisekunden initialisiert wird. Wenn Java die Uhrzeit standardmäßig anzeigt, werden die Millisekunden (sowie der p6spy-Logger) abgeschnitten, aber die Datenbank rundet die Millisekunden auf Sekunden. Somit zeigt die Hälfte der Zeit null Sekunden und die Hälfte der Zeit eine Sekunde.

Verwandte Themen