2017-11-17 1 views
0

Ich habe ein Datum in mysql ohne Zeitzone, wie 2001-01-10 00:00:00 gespeichert. Ich habe Tomcat läuft in der Zeitzone +10: 00 zum Beispiel. Ich muss ein Date() generieren, die keinen Offset im Objekt haben.Java Datum generiert in verschiedenen Zeitzone, dass Tomcat läuft

Wenn ich dies tun:

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); 
cal.setTime(new Date(/*from 2001-01-10 00:00:00*/)); 
cal.set(Calendar.HOUR_OF_DAY, 0); 
cal.set(Calendar.MINUTE, 0); 
cal.set(Calendar.SECOND, 0); 
cal.set(Calendar.MILLISECOND, 0); 
Date newDate = cal.getTime(); 

Das Ergebnis Date-Objekt immer noch den mit und zoneoffset zoneinfo auf Server-Zeitzone berichtet, nicht UTC.

Ich muss ein Date() Objekt generieren, das ZERO TIME hat, aber das Datum in mysql gespeichert, unabhängig von tomcat timezone. Mit anderen Worten, ich möchte ein Datum mit Null Stunde/Min/Sek unabhängig von Server Zeitzone generieren.

The date generated shows 2001-01-01T00:00:00.000+1400 
the time is zero but offset is +14:00. 
I want to generate 2001-01-01T00:00:00.000+0000 

Die mysql Datatime ist DATETIME-

+2

Bitte lesen Sie https://codeblog.jonskeet.uk/2017/04/23/all-about-java-util-date/ - ein 'java.util.Date' ist * nur * ein Augenblick in der Zeit. Es hat keine Zeitzoneninformationen. –

+0

Gibt es einen Grund, warum Sie immer noch an den veralteten Klassen "Date" und "Calendar" hängen? 'java.time', die moderne Java-API für Datum und Uhrzeit, ist viel nocer zum Arbeiten mit und das Abrufen von Datums- und Zeitangaben als 'LocalDateTime' aus der Datenbank sollte einfach sein. –

+0

Was ist der genaue Datentyp in MySQL? 'DATUM'? 'DATETIME'? –

Antwort

0

Nun, die einzige Möglichkeit, die ich gewünschte Ergebnis erwerben, macht eine auf Java Datum einstellen, erhalte ich die aktuelle Offset von Tomcat und hinzufügen/entfernen ihn aus dem Datum, die Follow-Funktion machen das Datum von Rest zurückgegeben ist immer gleich, unabhängig von der tomcat Zeitzone. Ich benutze dafür JODA DateTime.

public Date adjustDateTimeZoneToUTC(Date date) 
{ 
    Date utcDate = null; 
    if(date != null) 
    { 
     int curOffset = TimeZone.getDefault().getRawOffset(); 

     DateTime dt = new DateTime(date).withZoneRetainFields(DateTimeZone.UTC); 
     // Se o offset for NEGATIVO(-12:00), deve-se somar esse tempo 
     // Se o offset for POSITIVO(+12:00), deve-se subtrair esse tempo 
     if(curOffset >= 0) { 
      dt.minusMillis(curOffset); 
     } else { 
      curOffset *= -1; 
      dt.plusMillis(curOffset); 
     } 
     utcDate = dt.toDate(); 
    } 
    return utcDate; 
} 

Auf der Clientseite, Winkelpicker oder anderen Javascript-Kalender verwendet, müssen Sie die gleiche Art und Weise auf Javascript zu tun, für Sie Aufenthalt imutable auf verschiedene Zeitzonen stammen. Wie die Probe:

$dateParser.timezoneOffsetAdjust = function (date, timezone, undo) { 
if (!date) { 
    return null; 
} 
// Right now, only 'UTC' is supported. 
if (timezone && timezone === 'UTC') { 
    date = new Date(date.getTime()); 
    date.setMinutes(date.getMinutes() + (undo ? -1 : 1) * date.getTimezoneOffset()); 
} 
return date; 

};

1

Das Date-Objekt nicht die Zeitzoneninformationen halten, stellen sie als eine Klasse mit nur einem langen Eigenschaft, die die Anzahl der Millisekunden speichert, die von 1970 übergeben

Die SimpleDateFormat-Klasse oder andere Bibliotheken wie JODA sind dafür verantwortlich, die Zeitzone zu verfolgen, wenn sie das Datum in eine Zeichenfolge umwandeln.

+0

Hallo Zoltan, Sie haben sich geirrt, wenn Sie debuggen und in Java Date Object schauen, sehen Sie die zoneinfo, die der Server-Zeitzone entspricht, nicht mit der UTC, die in Kalender erstellt wurde. Das Ergebnisdatum ist wie 2001-01-01T00: 00: 00.000 + 1400, die +1400 ist der Offset, den ich vermeiden muss. – Leonardo

+1

Dies ist nur das Ergebnis der toString() -Methode, die andere Objekte verwendet, um das Datum in der standardmäßigen Ländereinstellung und Zeitzone zu drucken. Wenn Sie sich die toString() - Implementierung ansehen (die der Debugger verwendet, um den Wert anzuzeigen), werden Sie sehen, dass andere Objekte erstellt werden, um die Umwandlung in eine Zeichenfolge zu ermöglichen. –

+0

Betrachtet man ein zufälliges 'Date' in meinem Debugger, hat es Felder' cdate' ('null') und' fastTime' (Millisekunden seit dem EOPCH, wenn ich mich nicht irre). Keine Zeitzone oder Offset. –

0

Das Datum selbst hat keine Zeitzone. Seine toString() Methode verwendet die aktuelle Standardzeitzone, um eine Zeichenfolge zurückzugeben, die dieses Datum darstellt, wie unter in this post erläutert. Sie können jedoch genau die Zielzeitzone während der Formatierung, um das gewünschte Ergebnis zu erhalten:

// 2001-01-01T00:00:00.000+00:00 
long timestamp = 978307200_000L; 
Date newDate = new Date(timestamp); 

SimpleDateFormat u = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 
u.setTimeZone(TimeZone.getTimeZone("UTC")); 

SimpleDateFormat k = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); 
k.setTimeZone(TimeZone.getTimeZone("Pacific/Kiritimati")); 

assertEquals("2001-01-01T00:00:00.000+0000", u.format(newDate)); 
assertEquals("2001-01-01T14:00:00.000+1400", k.format(newDate));