2017-03-02 3 views
0

So bekomme ich einige Datumsobjekte von einem Webserver, ich weiß, dass der Server die Zeit in GMT +1 (Berlin) hat, wie kann ich das Datumsobjekt konvertieren , zum aktuellen Telefon Zeitzone Datum Objekt?Konvertieren von Datumsobjekt mit einer bekannten Zeitzone, zur aktuellen Zeitzone

Bei den meisten Fragen zu stackoverflow handelt es sich nur um Formatierungen innerhalb einer Zeitzone, die jedoch nicht so konvertiert werden.

habe ich versucht, diese

Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT+1")); 
    calendar.setTime(timeFromServer); 
    Calendar calendar2 = new GregorianCalendar(TimeZone.getDefault()); 
    calendar2.setTimeInMillis(calendar.getTimeInMillis()); 

, wenn ich drucken, calendar2.getTime() toString() und timeFromServer.toString() werden die gleichen sein.

+0

hast du irgendwas probiert? –

+0

@Dan Ich habe meine Frage aktualisiert –

+0

Was genau bedeutet "einige Datenobjekte von einem Webserver"? Bekommst du eine Schnur? –

Antwort

0

Ich verwendete Joda time und es funktioniert. Sie können mit Joda Zeit versuchen. Diese Methode wird die Zeit vom Server konvertiert unter Format Zeit anzuzeigen und lokal auf den jeweiligen Zeitpunkt

public static final String SERVER_FORMAT = "yyyy-MM-dd HH:mm:ss"; 
    public static final String DISPLAY_POST_FORMAT = "HH:mm dd/MM/yyyy"; 

public static String convertDateStrToDisplayFormat(String timeFromServer) { 
     DateTimeFormatter serverFormatter = DateTimeFormat.forPattern(Constants.SERVER_FORMAT); 
    serverFormatter.withZone(DateTimeZone.forID("Europe/Berlin")); 
    DateTime dateTime = DateTime.parse(timeFromServer, serverFormatter); 

    DateTimeFormatter pointTimeFormatter = DateTimeFormat.forPattern(Constants.POINT_TIME_FORMAT); 
    pointTimeFormatter.withZone(DateTimeZone.forID("Europe/Berlin")); 

    return pointTimeFormatter.print(dateTime) 
    } 
+0

Ich möchte nicht in String konvertieren, was ist, wenn ich nur das Datum möchte? Gibt es einen besseren Weg, als den String erneut zu analysieren? Denn momentan gibt es viel zu tun, nur um zwischen 2 Zeitzonen zu konvertieren. –

0

ich das das Datum vom Server zu konvertieren verwenden ändern und es zu aktueller Telefonzeitzone Datum Objekt konvertiere

SimpleDateFormat sourceFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ENGLISH); 
sourceFormat.setTimeZone(TimeZone.getTimeZone("UTC")); 
SimpleDateFormat deviceFormat = new SimpleDateFormat("EE MMM dd HH:mm:ss z yyyy",Locale.ENGLISH); 
deviceFormat.setTimeZone(TimeZone.getDefault()); 
Date utcDate ; 
Date deviceDate ; 

utcDate = sourceFormat.parse(event_date); 
deviceDate = deviceFormat.parse(utcDate.toString()); 

event_date ist ein String mit dem Serverdatum. Danach haben Sie Ihr konvertiertes Datum auf deviceDate.

+0

In meinem Fall ist event_date bereits ein Datumsobjekt. Was kann ich tun? –

+0

Ich bin mir nicht sicher, aber Sie können zwei Dinge versuchen: 'utcDate = sourceFormat.parse (event_date.toString());' oder diese 'deviceDate = deviceFormat.parse (sourceFormat.format (event_date));'.Ich denke, dass der erste funktioniert –

0

java.util.Date nicht Zeitzone verwenden, so dass, wenn Sie versuchen, die String-Darstellung der folgenden Datums Objekte drucken mit der Methode Date#toString(), die Ergebnisse sind die gleichen:

  • calendar2.getTime().toString()
  • timeFromServer.toString()

Um die Zeichenfolgendarstellung korrekt mit der Zeitzone zu testen, müssen Sie SimpleDateFormat:

0 verwenden
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); 
f.setTimeZone(calendar.getTimeZone()); 

// Date correctly printed with timezone: 
System.out.println(f.parse(calendar.getTime())); 

jedoch Ihre Umwandlung in der Frage geschrieben ist richtig, hier ist, wie ich es JUnit mit getestet:

@Test 
public void testDateConversion() throws ParseException { 
    String serverText = "2017-03-02T11:54:30.207+01:00"; 

    SimpleDateFormat serverFmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); 
    serverFmt.setTimeZone(TimeZone.getTimeZone("GMT+1")); 
    Date timeFromServer = serverFmt.parse(serverText); 

    Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT-1")); 
    calendar.setTime(timeFromServer); 

    assertEquals(2017, calendar.get(Calendar.YEAR)); 
    assertEquals(Calendar.MARCH, calendar.get(Calendar.MONTH)); 
    assertEquals(2, calendar.get(Calendar.DAY_OF_MONTH)); 
    assertEquals(9, calendar.get(Calendar.HOUR_OF_DAY)); 
    assertEquals(54, calendar.get(Calendar.MINUTE)); 
    assertEquals(30, calendar.get(Calendar.SECOND)); 
    assertEquals(207, calendar.get(Calendar.MILLISECOND)); 

    SimpleDateFormat currFmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); 
    currFmt.setTimeZone(calendar.getTimeZone()); 

    System.out.printf("server_timestamp = %d, server_date = '%s', server_str = '%s'%n", 
     timeFromServer.getTime(), 
     serverFmt.format(timeFromServer), 
     timeFromServer.toString()); 
    System.out.printf("current_timestamp = %d, current_date = '%s', current_str = '%s'%n", 
     calendar.getTime().getTime(), 
     currFmt.format(calendar.getTime()), 
     calendar.getTime().toString()); 
} 

Ergebnis:

server_timestamp = 1488452070207, server_date = '2017-03-02T11:54:30.207+01:00', server_str = 'Thu Mar 02 11:54:30 CET 2017' 
current_timestamp = 1488452070207, current_date = '2017-03-02T09:54:30.207-01:00', current_str = 'Thu Mar 02 11:54:30 CET 2017' 

Siehe auch:

Verwandte Themen