2009-08-30 4 views
38

bekam ich eine Zeichenfolge, die mithilfe dieser das aktuelle Datum enthält:NSString zu NSDate

NSString *date = [[NSDate date] description]; 

an einer anderen Stelle ich das Datum aus dieser Zeichenfolge abrufen möchten und ich den folgenden Code:

[NSDateFormatter setDefaultFormatterBehavior:NSDateFormatterBehavior10_4]; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
//[NSDateFormatter setDefaultFormatterBehavior:NSDateFormatterBehaviorDefault]; 
[dateFormatter setDateFormat:@"YYYY-MM-DD HH:MM:SS ±HHMM"]; 

NSDate *dateFromString = [[NSDate alloc] init]; 
dateFromString = [dateFormatter dateFromString:<NSString containing date>]; 

Ich bekomme dateFromString als nil 0x0. Was mache ich falsch?

Antwort

64

Sie können Format String-Syntax nicht erfinden und erwarten, dass es funktioniert; Sie müssen tatsächlich ein dokumentiertes Format verwenden. (Ernsthaft, "MM" bedeutet "Monat", "Minute" und "GMT Offset Minuten" alle zur gleichen Zeit?)

Wie die documentation weist darauf hin, verwenden die 10.4 Formatierer Unicode format strings.

Versuchen Sie stattdessen "yyyy-MM-dd HH: mm: ss ZZZ".

Auch Objective-C-Quelle ist ASCII. Setze keine Zeichen wie ± hinein und erwarte, dass es in irgendeinem Kontext funktioniert; Verwenden Sie stattdessen Zeichenkettendateien.

+1

Funktioniert einwandfrei – Minar

+0

Unicode UTF-8 funktioniert in Quelle gut. – Jonny

+1

Das hat sich mit dem Wechsel zu neueren Compilern geändert, seit ich meine ursprüngliche Antwort geschrieben habe (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Strings/Articles/CreatingStrings.html#//apple_ref/doc/ uid/20000148-SW1). –

7

Auch dateFromString: gibt ein Autoreleased NSDate, so:

NSDate *dateFromString = [[NSDate alloc] init]; // <- non freed instance 
dateFromString = [dateFormatter dateFromString:<NSString containing date>]; // <- new autoreleased instance 
.... 
[dateFromString release]; // <- wrong 

Möchten Sie folgendes: vorher beantwortet

//NSDate *dateFromString = [[NSDate alloc] init]; 
NSDate *dateFromString = [dateFormatter dateFromString:<NSString containing date>]; 
.... 
//[dateFromString release]; // dateFromString is autoreleased 

Hope this jemand :)

Als
+0

Was ist DateFormatter? –

+0

Aus der Frage selbst: NSDateFormatter * dateFormatter = [[NSDateFormatter Alloc] init]; – grilix

-1

retten könnte, dass passiert, wenn Sie ein neues System entwickeln.

Basierend auf Apple NSDateFormatter Class Reference Dokumentation

Es gibt viele Attribute, die Sie Formatierer auf einem Stil Datum, erhalten und einstellen ... Sie werden ermutigt, nicht jedoch individuelle Einstellungen zu ändern . Stattdessen sollten Sie die Standardeinstellungen festgelegt bei der Initialisierung übernehmen und geben Sie das Format setDateStyle :, setTimeStyle mit:

Dies ist besonders wichtig für die Ausgabe, die für jedes Gebietsschema unterscheidet. Standardmäßig beobachtet NSDateFormatter die Gebietsschemaeinstellungen des aktuellen Benutzers. So könnte das gleiche NSDate 22.11.2011 18:33:19 oder Nov 22, 2011 6:33:19 PM oder 2011-11-22 下午6:33:19 oder sogar २२-११-२०११ ६:३३:१९ अपराह् sein, alle für den gleichen Eingang und mit dem gleichen Code.

Betrachten wir zum Beispiel diesen Code

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 

[dateFormatter setDateStyle:NSDateFormatterShortStyle]; 
[dateFormatter setTimeStyle:NSDateFormatterShortStyle]; 

// ShortStyle used: 11/23/37 3:30pm 
NSString *dateString = [dateFormatter stringFromDate:date]; 

prüfen Apple-Dokumentation für die verschiedenen Arten von NSDateFormatterStyle oder dieses excellent tutorial

2

Sie könnten TouchTime überprüfen.

https://github.com/jheising/TouchTime.

Es ist ein direkter Port der fantastischen strtotime Funktion in PHP in 5.4 für Kakao und iOS. Es nimmt so ziemlich jedes willkürliche Datums- oder Zeitformat an und konvertiert es in ein NSDate.

Hoffe es funktioniert, und viel Spaß!

2

Eine NSString Erweiterung dafür gemacht.

// Simple as this. 
date = dateString.dateValue; 

Dank NSDataDetector, erkennt es eine ganze Menge von Format.

// Tested in GMT+1 (Hungary). 
@"2014-01-16" dateValue is <2014-01-16 11:00:00 +0000> 
@"2014.01.16" dateValue is <2014-01-16 11:00:00 +0000> 
@"2014/01/16" dateValue is <2014-01-16 11:00:00 +0000> 
@"2014 Jan 16" dateValue is <2014-01-16 11:00:00 +0000> 
@"2014 Jan 16th" dateValue is <2014-01-16 11:00:00 +0000> 
@"20140116" dateValue is <2014-01-16 11:00:00 +0000> 
@"01-16-2014" dateValue is <2014-01-16 11:00:00 +0000> 
@"01.16.2014" dateValue is <2014-01-16 11:00:00 +0000> 
@"01/16/2014" dateValue is <2014-01-16 11:00:00 +0000> 
@"16 January 2014" dateValue is <2014-01-16 11:00:00 +0000> 
@"01-16-2014 17:05:05" dateValue is <2014-01-16 16:05:05 +0000> 
@"01-16-2014 T 17:05:05 UTC" dateValue is <2014-01-16 17:05:05 +0000> 
@"17:05, 1 January 2014 (UTC)" dateValue is <2014-01-01 16:05:00 +0000> 

Teil eppz!kit, die Kategorie von NSString+EPPZKit.h GitHub greifen.


ORIGINAL ANTWORT: Egal, ob Sie sich nicht sicher sind (oder einfach nicht kümmern) über das Datumsformat in der Zeichenfolge enthalten ist, Verwendung NSDataDetector für Parsen Datum.

//Role players. 
NSString *dateString = @"Wed, 03 Jul 2013 02:16:02 -0700"; 
__block NSDate *detectedDate; 

//Detect. 
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingAllTypes error:nil]; 
[detector enumerateMatchesInString:dateString 
          options:kNilOptions 
          range:NSMakeRange(0, [dateString length]) 
         usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) 
{ detectedDate = result.date; }];