2016-04-16 8 views
2

Ich habe eine Anwendung, in der Benutzer Fragen erstellt und andere können Datum Datum sehen (wenn die Frage erstellt wurde) mit ihm. Jetzt bekomme ich die Server Datum Zeit und speichern Sie es in db, aber das Problem ist App wird von jemand, der in einem Land mit einer 6-7 Stunden Lücke leben. Nun ein kleines Beispiel wäre, dass ich in einem Land lebe und ich um 19:00 Uhr Frage kreiere, aber die Zeit in den USA ist 11:00 (nur ein Tipp). So ruft der Benutzer sofort die Frage ab, aber für ihn sollte die Frage 11 Uhr und nicht 19 Uhr sein. Wie kann ich das Datum speichern, damit es für alle Zeitzonen gleich ist? Ich bin irgendwie verwirrt , also brauche ich ein wenig Hilfe. Ich weiß, dass es mit UTC Date Time zusammenhängt, aber kann jemand dieses ein bisschen mehr ausarbeiten :). Thank uSpeichern Datum Zeit für alle Zeitzonen in Java

+0

Datumsangaben haben keine Zeitzonen. nur Datumsangaben haben. Sie speichern das Datum selbst, und wenn Sie es anzeigen, wenden Sie die Zeitzone abhängig von der Ländereinstellung an. – njzk2

Antwort

3

Speichern Sie in Ihrer Datenbank die Differenz, gemessen in Millisekunden, zwischen der aktuellen Uhrzeit und der epoch von Mitternacht, 1. Januar 1970 UTC. dass Sie erhalten können, indem Sie System.currentTimeMillis() anrufen.

Sobald Sie es haben können Sie die Zeit in jeder Time Zone, die Sie wollen, hier ist ein einfaches Code-Snippet, das die Zeit in all the time zones auf meinem Rechner zur Verfügung stellt.

Dieser Code verwendet das in Java 8 und höher integrierte Framework java.time. Ein Großteil dieser Funktionalität war auch back-ported to Java 6 & 7 und to Android.

long time = System.currentTimeMillis(); 
Instant instant = Instant.ofEpochMilli(time); 
ZoneId.getAvailableZoneIds().stream().forEach(id -> { 
     ZoneId zId = ZoneId.of(id); 
     LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zId); 
     System.out.printf(
      "The current time in %s is %s%n", 
      zId, localDateTime.format(DateTimeFormatter.ISO_DATE_TIME) 
     ); 
    } 
); 

Hier ist das Äquivalent für ältere Versionen von Java:

long time = System.currentTimeMillis(); 
Calendar cal = Calendar.getInstance(); 
cal.setTimeInMillis(time); 
for (String id : TimeZone.getAvailableIDs()) { 
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); 
    formatter.setTimeZone(TimeZone.getTimeZone(id)); 
    System.out.printf(
     "The current time in %s is %s%n", id, formatter.format(cal.getTime()) 
    ); 
} 

Antwort Update:

Wie Sie das Original TimeZone behalten möchten, werden Sie auch die Zeit zu speichern haben Zonen-ID in Ihre Datenbank im Format Pseudo-Standard Format GMT +/- mm: ss.

Dazu müssen Sie zunächst das Delta erhalten im Vergleich zu UTC-Zeit (in Code-Snippet tz ist meine aktuelle Zeitzone):

int offsetFromUTC = tz.getOffset(time); 

daraus Dann können Sie dieses Delta in Millisekunden in denen umwandeln erwartete Zeitzone-ID, die wie dies getan werden kann:

String timeZoneId = String.format(
    "GMT%+02d:%02d", offsetFromUTC/(60 * 60 * 1000), offsetFromUTC/(60 * 1000) % 60 
); 

der Wert von timeZoneId ist der zweite Wert, den Sie in der Datenbank zu speichern haben. Mit diesen beiden Werten können Sie die Uhrzeit in jedem erwarteten Format anzeigen, zum Beispiel:

Calendar cal = Calendar.getInstance(); 
// Here I use the time retrieved from the DB 
cal.setTimeInMillis(time); 
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); 
// Here I use the time zone id retrieved from the DB 
TimeZone tz = TimeZone.getTimeZone(timeZoneId); 
formatter.setTimeZone(tz); 
System.out.printf("The current time in %s is %s%n", id, formatter.format(cal.getTime())); 
+0

ich kann nicht sowohl Instant- als auch ZoneID-Klassen importieren, was bedeutet, dass ich eine Bibliothek benutzen muss? . Aber ich möchte keine Bibliothek verwenden –

+0

es ist Teil von Java 8, welche Version von Java verwenden Sie? –

+0

@SyedMuhammadOan Ich aktualisierte meine Antwort für die vorherige Version von Java –

3

So wie kann ich Datum Zeit zu sparen, so dass es für alle Zeitzonen gleich sein würde

Sie sollten UTC verwenden Ihre Daten zu speichern, so dass, wenn jemand Ihre Anwendung in +1 Zeitzone mit , müssen Sie zuerst in UTC konvertieren. Zeitzone sollte nur verwendet werden, um die Zeit für die Benutzer anzuzeigen.

+0

Oder speichern Sie einfach das gesamte Datum + Zeitzone; Sie können nach Belieben in eine beliebige Zeitzone umwandeln.Wenn Sie Joda Time verwenden, ist es besonders einfach – fge

+0

U bedeutet, ich sollte das Datum in DB speichern und es in meiner Android App konvertieren? –

+1

Ja. Verwenden Sie die Zeitzone, um dem Benutzer nur die Zeit als "lokal" anzuzeigen. Also, wenn er/sie die Zeitzone ändert, zB weil er unterwegs ist, wird immer noch die richtige Zeit in der TZ angezeigt/er wird dann –