2016-04-22 14 views
1

Ich habe den folgenden Code, der GMT-Zeit in Ortszeit umrechnet, ich nahm es von einer Antwort hier auf StackOverflow, das Problem ist, dass dieser Code einen falschen Wert von GMT-Zeit zurückgibt .GMT zum lokalen Verbergen in falscher Weise (falscher Wert)

Meine GMT-Zeit ist: +3, aber der Code verwendet +2, es dauert die GMT-Zeit von meinem Gerät ich denke, und die Zeit meines Geräts ist +3 GMT.

Hier ist der Code:

 String inputText = "12:00"; 
    SimpleDateFormat inputFormat = new SimpleDateFormat 
      ("kk:mm", Locale.US); 
    inputFormat.setTimeZone(TimeZone.getTimeZone("GMT")); 

    SimpleDateFormat outputFormat = 
      new SimpleDateFormat("kk:mm"); 
    // Adjust locale and zone appropriately 
    Date date = null; 
    try { 
     date = inputFormat.parse(inputText); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
    String outputText = outputFormat.format(date); 
    Log.i("Time","Time Is: " + outputText); 

Die Log-Returns 14:00

Antwort

4

Dies wird auf den Zeitpunkt bezogen, auf dem Sie die Konvertierung tun.

Sie geben nur die Stunden und Minuten an, sodass die Berechnung am 1. Januar 1970 erfolgt. An diesem Datum beträgt der GMT-Offset in Ihrer Zeitzone vermutlich nur 2 Stunden.

Geben Sie auch das Datum an.


SimpleDateFormat inputFormat = 
    new SimpleDateFormat("kk:mm", Locale.US); 
inputFormat.setTimeZone(TimeZone.getTimeZone("GMT")); 

SimpleDateFormat outputFormat = 
    new SimpleDateFormat("yyyy/MM/dd kk:mm", Locale.US); 
outputFormat.setTimeZone(TimeZone.getTimeZone("GMT")); 

Date date = inputFormat.parse("12:00"); 

System.out.println("Time Is: " + outputFormat.format(date)); 

Ideone demo

Ausgang:

Time Is: 1970/01/01 12:00 

Zusätzliche Code zu Sommerzeit/Sommerzeit Auswirkungen:

SimpleDateFormat gmtFormat = new SimpleDateFormat("yyyy/MM/dd kk:mm", Locale.US); 
gmtFormat.setTimeZone(TimeZone.getTimeZone("GMT")); 

SimpleDateFormat finlandFormat = new SimpleDateFormat("yyyy/MM/dd kk:mm zzz", Locale.US); 
finlandFormat.setTimeZone(TimeZone.getTimeZone("Europe/Helsinki")); 

SimpleDateFormat plus3Format = new SimpleDateFormat("yyyy/MM/dd kk:mm zzz", Locale.US); 
plus3Format.setTimeZone(TimeZone.getTimeZone("GMT+3")); 

Date date = gmtFormat.parse("1970/01/01 12:00"); 
System.out.println("Time Is: " + gmtFormat.format(date)); 
System.out.println("Time Is: " + finlandFormat.format(date)); 
System.out.println("Time Is: " + plus3Format.format(date)); 

date = gmtFormat.parse("2016/04/22 12:00"); 
System.out.println("Time Is: " + gmtFormat.format(date)); 
System.out.println("Time Is: " + finlandFormat.format(date)); 
System.out.println("Time Is: " + plus3Format.format(date)); 

Ausgang:

Time Is: 1970/01/01 12:00 
Time Is: 1970/01/01 14:00 EET   <-- Eastern European Time 
Time Is: 1970/01/01 15:00 GMT+03:00 
Time Is: 2016/04/22 12:00 
Time Is: 2016/04/22 15:00 EEST  <-- Eastern European Summer Time 
Time Is: 2016/04/22 15:00 GMT+03:00 
+0

Mich nicht, der Ausgang ist: 1970.01.01 14.00 Uhr, ich glaube nicht, dass es auf das Jahr bezogen ist, wie es die GMT-Offset aus dem Gerät kommt, also warum es braucht das Jahr auch? . – Jaeger

+0

Ich wette du wusstest nicht, dass der GMT Offset von Europa/London in der Unix Epoche (1970/01/01) eigentlich + 1h war, weil das Vereinigte Königreich zu diesem Zeitpunkt zwischen [27. Oktober 1968 und 31. Oktober 1971] permanente Sommerzeiteinsparungen hatte ] (https://en.wikipedia.org/wiki/British_Summer_Time#Periods_of_deviation). Am JJJJ/01.01. War es für jedes Jahr +0h. Ohne das Jahr zu kennen, kann man aus solchen Gründen nicht korrekt konvertieren. –

+0

Außerdem beginnt und endet die Sommerzeit nicht jedes Jahr am selben Tag. –