2012-04-05 5 views
2

Ich habe einen Server, der die Zeiten der Daten zwischen Benutzern in einer mySQL-Datenbank mit NOW() speichert, um die Uhrzeit einzustellen. Ich versuche, die Zeit auf die lokale Zeit des Empfängers zu konvertieren, aber nicht viel Glück (ich würde die Zeit vor dem Speichern konvertieren, aber wie ich sage, ich möchte die Zeit für den Empfänger, nicht der Absender sein). Das Datum für die App als String zurückgegeben wird, und ich habe versucht, es wie folgt anzupassen:iOS - Konvertieren eines Datums von einem mySQL-Server in Benutzer lokale Zeit

NSString *string1 = [[receivedMessages objectAtIndex:thisRow]objectAtIndex:2]; 
NSDate *messageDate; 
NSCalendar* cal = NSCalendar.currentCalendar; 
NSTimeZone* tz = cal.timeZone; 

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"MM dd yyyy hh:mma"]; 
[formatter setTimeZone:tz]; 

messageDate = [formatter dateFromString:string1]; 

Es ist der Art des Datumsformats, aber nicht korrekt. Ein Datum, das von der App als empfangen wird:

April 5 2012 5:49AM 

umgewandelt wird:

2012-04-05 04:49:00 +0000 

Ich frage mich, wie Xcode funktioniert die Zeitzone das Datum gehörte in erster Linie?

Eigentlich habe ich nur getestet es wieder

mit
NSTimeZone *pst = [NSTimeZone timeZoneWithAbbreviation:@"PST"]; 

anstelle von

NSCalendar* cal = NSCalendar.currentCalendar; 
NSTimeZone* tz = cal.timeZone; 

und es gibt mir noch die Zeit als 2012-04-05 04.49.00 + 0000.

Wer hat irgendwelche Ideen?

Vielen Dank

Antwort

2

From the Apple docs, messageDate = [formatter dateFromString:string1]; wird eine NSDate zurück. Wenn Sie die Ergebnisse anzeigen, drucken Sie ein NSDate-Objekt, das (ich nehme an) in eine ISO 8601 date 'stringifiziert' ist. Diese NSDate-Objekte werden auf eine absolute Zeit normalisiert (ohne Zeitzoneninformationen).

Sobald Sie das Datumsobjekt haben, gehen Sie noch einen Schritt weiter und formatieren Sie die Ausgabe. Ich schätze, das tz, das du zeigst, ist für die ursprüngliche Zeit, also ist das in Ordnung (dateFromString wird in 'absolute Zeit' umgewandelt). Alles, was Sie hinzufügen müssen, ist etwas wie localizedStringFromDate:dateStyle:timeStyle:, um die Zeit lokal zu bekommen.

//If this is not in UTC, we don't have any knowledge about 
//which tz it is. MUST BE IN UTC. 
dateString = "2012-03-12 9:53:23" 

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"MM dd yyyy hh:mma"]; 

NSDate *date = [formatter dateFromString:dateString]; 

NSString *result = [NSDateFormatter localizedStringFromDate:date dateStyle:NSDateFormatterShortStyle timeStyle:NSDateFormatterShortStyle]; 

//The result should be in MY timezone automatically. 
+0

Ich bin mir nicht sicher, ich folge dir vollständig. Es könnte für mich einfacher sein zu erklären, wie es im Moment funktioniert. Wenn ein Benutzer seine Daten sendet, ist die aufgezeichnete Zeit die Uhrzeit auf dem Server - also GMT. Aber wenn der Absender in New York ist und der Empfänger in Tokio ist, dann ist GMT nicht gut für den Empfänger, noch ist die Zeit in NYC. Also muss ich die GMT-Zeit für die lokale Zeit des Benutzers konvertieren - aber ich sehe nicht, wie localizedStringFromDate das tun würde. Soweit ich das beurteilen kann, dient es nur dazu, die Struktur des Datums zu formatieren - ohne seine Werte zu ändern? Oder habe ich missverstanden, wie man es benutzt? – TheBestBigAl

+1

Wenn Sie das Datum vom Server abrufen, was ist das Format? String ISO 8601: '2012-02-28T09: 13: 23Z', Regulärer String:' 5. April 2012 12:34 ', POSIX: '123582342'? – Stephen

+0

Es sieht genau so aus: 2012-04-05 16:14:00, sieht am meisten wie die IOS 8601-Version aus, aber ich habe keine T oder Z's drin – TheBestBigAl

Verwandte Themen