2010-05-19 8 views
5
//NSString *compileDate = [NSString stringWithFormat:@"%s", __DATE__]; 
NSString *compileDate = [NSString stringWithUTF8String:__DATE__]; 

NSDateFormatter *df = [[[NSDateFormatter alloc] init] autorelease]; 

[df setDateFormat:@"MMM d yyyy"]; 
//[df setDateFormat:@"MMM dd yyyy"];  

NSDate *aDate = [df dateFromString:compileDate]; 

Ok, ich gebe auf. Warum würde aDate manchmal als null zurückkehren?iPhone SDK Objective-C __DATE__ (Kompilierdatum) kann nicht in ein NSDate konvertiert werden

Sollte es von Bedeutung sein, wenn ich die auskommentierten Linien ... oder ihre passenden Ersatzlinien verwende?

+6

kleine Notiz nicht wert eine Antwort : Aufgrund der Art, wie der Präprozessor funktioniert, um __DATE__ als NSString zu erhalten, können Sie einfach @__DATE__ –

Antwort

20

Es kann nil zurückgeben, wenn die Regionseinstellung des Telefons nicht US (oder gleichwertig) ist.

Versuchen Sie das Gebietsschema des Formatter Einstellung en_US:

NSString *compileDate = [NSString stringWithUTF8String:__DATE__]; 
NSDateFormatter *df = [[[NSDateFormatter alloc] init] autorelease]; 
[df setDateFormat:@"MMM d yyyy"]; 
NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; 
[df setLocale:usLocale]; 
[usLocale release]; 
NSDate *aDate = [df dateFromString:compileDate]; 
+0

Wow schreiben. Ich werde es versuchen. Ich dachte, __DATE__ würde immer während der Kompilierzeit bestimmt werden ... und basierend auf der Maschine, die ich kompiliert habe (Englisch). Also __DATE__ würde * IMMER * im "Feb 1 2010" -Format sein. (Ich frage nicht, ob das Datum während der Laufzeit oder basierend auf der lokalen Einstellung des Benutzers bestimmt wird.) – Susanna

+4

Das Makro '__DATE__' wird zur Kompilierzeit bestimmt und durch ein String-Literal in diesem Format ersetzt . Die Konvertierung dieser Zeichenfolge in ein NSDate erfolgt jedoch zur Laufzeit, die von der aktuellen Region beeinflusst wird. – DyingCactus

9

Modifizieren Leicht DyingCactus' Antwort für ARC-Code aktiviert ist (für eine einfachere Kopieren-n-Einfügen):

NSString *compileDate = [NSString stringWithUTF8String:__DATE__]; 
NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"MMM d yyyy"]; 
NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; 
[df setLocale:usLocale]; 
NSDate *aDate = [df dateFromString:compileDate];