• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Die Bildungsoffensive hier im Forum geht weiter! Jetzt sollen Kreativität und technische Möglichkeiten einen neue Dimension erreichen. Das Thema in diesem Monat lautet - Verkehrte Welt - Hier geht es lang --> Klick

Frage zum NSDateFormatter

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
Hallo zusammen,
ich habe zum NSDateFormatter andere Foren und Beitrage durchsucht und bei allen scheints zu funktionieren nur bei mir nicht.
Dabei habe ich der Einfachheit halber ein triviales testProgramm geschrieben.
Code:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

    [dateFormatter setDateFormat:@"dd.MM.yyyy"];
    
    NSDate *myDate = [dateFormatter dateFromString:@"01.03.2013"];
Wenn ich jetzt myDate augeben lasse kommt folgendes dabei raus:
Code:
2013-02-28 23:00:00 +0000
Irgendwie ist das jetzt genau einen Tag früher. und die Frage ist... warum????
Die einzigste Chanche das Datum richtig anzuzeigen bekomme ich wenn ich dieses
Datum wieder ein einen String umwandle und zwar so:
Code:
[dateFormatter stringFromDate:myDate]
Dann hab ich wieder den 01.03.2013, allerdings hab ich das Datum dann als String und nicht als Date-Objekt.
Auch die Änderung der TimeZone oder des Locale bringen rein gar nichts.
Kann mir jemand von euch einen Tipp geben wie ch das richtige Date-Objekt bekomme?
 
Es ist nicht einen Tag, sondern eine Stunde früher. Siehe +0000. In unserer Zeitzone ist es dann schon der 1.3.

EDIT: Soll heißen, es ist das richtige Date-Objekt. Beim Setzen des Datums wird halt deine Zeitzone genommen. Wenn du es dir dann über die description (NSLog) ansiehst, gibt er dir halt die UTC+0 Zeit aus.
 
Zuletzt bearbeitet:
Wenn er meine Zeitzone nehmen würde, wäre das Datum doch richtig. Wieso bekomme ich eigentlich die UTC+0 Zeit raus? Meine Zeitzone (bzw. die von Deutschland) ist UTC+1. Ich hab mal ausprobiert welche ZeitZone er als default nimmt. Dann wird ausgegeben:
Code:
Europe/Berlin (MESZ) offset 7200 (Daylight)
Heißt das jetzt ich muss 7200 sekunden offset abziehen um das richtige Daten zu erhalten? Wenn ich das mache stimmt das Datum zwar aber ich bekomme dann eine willkürliche Uhrzeit.

EDIT: Ausserdem kann das ja nicht angehen das ich jedesmal einen offset abziehen muss.
 
Der speichert INTERN als UTC+0. Irgendetwas muss er ja speichern. Es ist ein fester globaler Zeitpunkt und genau der Zeitpunkt den du vorher als deutsche Zeit reingeschmissen hast. Er gibt dir doch auch als String die Zeit (wieder als UTC+1) zurück.
 
Ja, das ist schon richtig. Aber dann hab ich es als String, aber ich möchte es ja gerne als NSDate-Objekt. Hmmmm, ok es ist dasselbe Objekt aber das ist ja blöd das ich keine möglichkeit habe ihm das richtig beizubringen. Ich mein für die GUI ist es ja egal da brauch ich das Datum eh als String. Es wird halt nur in der Konsole dann falsch angezeigt. Vielleicht muss man sich da auch gar nicht ran stören und das einfach ignorieren, hatte mich eben nur sehr gewundert.
 
Code:
[COLOR=#703DAA]NSDateFormatter[/COLOR][COLOR=#000000] *dateFormatter = [[[/COLOR][COLOR=#703DAA]NSDateFormatter[/COLOR][COLOR=#3D1D81]alloc[/COLOR][COLOR=#000000]] [/COLOR][COLOR=#3D1D81]init[/COLOR][COLOR=#000000]];[/COLOR]    
[dateFormatter [COLOR=#3d1d81]setDateFormat[/COLOR]:[COLOR=#d12f1b]@"dd.MM.yyyy"[/COLOR]];
[COLOR=#3D1D81][COLOR=#000000][dateFormatter [/COLOR]setTimeZone[COLOR=#000000]:[[/COLOR][COLOR=#703daa]NSTimeZone[/COLOR]timeZoneWithName[COLOR=#000000]:[/COLOR][COLOR=#d12f1b]@"GMT"[/COLOR][COLOR=#000000]]];[/COLOR][/COLOR]
[COLOR=#703daa]NSDate[/COLOR] *myDate = [dateFormatter [COLOR=#3d1d81]dateFromString[/COLOR]:[COLOR=#d12f1b]@"01.03.2013"[/COLOR]];
    
[COLOR=#008400][COLOR=#3D1D81]NSLog[/COLOR]([COLOR=#D12F1B]@"%@"[/COLOR],myDate);
[/COLOR]

Das setzen einer TimeZone verändert schon was, nur ob es die gewünschte Veränderung ist....
 
aber das ist ja blöd das ich keine möglichkeit habe ihm das richtig beizubringen.

Da ist doch alles richtig. Du gibst das Datum nur "falsch" aus.

Wenn Du dem System sagst, es soll das Datum in einem bestimmten Kalendersystem und einer bestimmten Zeitzone anzeigen, wird es genau das tun.

Wenn Du dem System jedoch nur sagst, es soll das gespeicherte Datum "irgendwie" anzeigen (bisher hast Du verschwiegen, was Du genau machst), dann darf sich das System frei entscheiden. Standardmäßig entscheidet es sich für den gregorianischen Kalender und die Zeitzone "Universal Time Coordinated".
 
Servus
Ich weiß nicht wie aktuell das hier noch ist aber ich hab da noch ein paar Anmerkungen zu.
Der Aussage von Marcel Bersink kann ich nur zustimmen du lässt ihm das Object einfach ausgeben unformatiert eben.
Da du aber einen DateFormatter bereits am Wickel hast dann lass dem es doch auch formatieren bei der Ausgabe.
Ich würde das mit dem setzen der lokalen Time Zone etwas anderes machen hier mal mein Vorschlag:
Code:
[COLOR=#703DAA]NSDateFormatter[COLOR=#000000] *f = [[[/COLOR]NSDateFormatter[COLOR=#3d1d81]alloc[/COLOR][COLOR=#000000]] [/COLOR][COLOR=#3d1d81]init[/COLOR][COLOR=#000000]];[/COLOR][/COLOR]
[COLOR=#3D1D81][COLOR=#000000][f [/COLOR]setDateFormat[COLOR=#000000]:[/COLOR][COLOR=#d12f1b]@"dd.MM.yyyy"[/COLOR][COLOR=#000000]];[/COLOR][/COLOR]
[COLOR=#3D1D81][COLOR=#000000][f [/COLOR]setTimeZone[COLOR=#000000]:[[/COLOR][COLOR=#703daa]NSTimeZone[/COLOR]localTimeZone[COLOR=#000000]]];[/COLOR][/COLOR]
[COLOR=#703daa]NSDate[/COLOR] *myDate = [f [COLOR=#3d1d81]dateFromString[/COLOR]:[COLOR=#d12f1b]@"01.03.2013"[/COLOR]];
[COLOR=#3d1d81]NSLog[/COLOR]([COLOR=#d12f1b]@"%@"[/COLOR], [f [COLOR=#3d1d81]stringFromDate[/COLOR]:myDate] );
Hat den Vorteil dass du nicht die Zeitzone raussuchen musst sondern er nimmt die vom Gerät.

Dude