2016-05-31 3 views
0

Ich habe einen UIDataPicker in meinem Viewcontroller mit Standardverzeichnis, wenn mein Benutzer beendet das Datum der Auswahl ich diesen Code ausführen:NSDateFormatterLongStyle String NSDate

NSString *dateString = [NSDateFormatter localizedStringFromDate:[self.dataPicker date] 
                  dateStyle:NSDateFormatterLongStyle 
                timeStyle:NSDateFormatterNoStyle]; 

Mit diesem Code I Speicher können das Datum in folgendem Format:

31. Mai 2016

Später in meinem Code muss ich diese Zeichenfolge in ein richtiges Date-Format konvertieren, für diese verwende ich den Kabeljau e unten:

-(NSDate*)convertStringToDate:(NSString*)date{ 
    NSString *dateString = date; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; 
    [dateFormatter setDateFormat:@"MM/dd/yyyy"]; 

    return [dateFormatter dateFromString:dateString]; 
} 

Aber dieser Code gibt einen Nullwert zurück. Da der Datepicker standardmäßig eingestellt ist, kann mein System jedes Datumsformat erhalten, aber am Ende möchte ich, dass es in das Format en_us konvertiert wird.

Wie kann ich dieses Problem lösen?

+0

sehen dieses Tutorial: https: //iosdevcenters.blogspot.com/2016/03/nsdateformatter-in-swift.html –

+0

'31. Mai 2016' gegen 'MM/dd/yyyy' Siehst du das gleiche Format dort? Das Format MM/TT/JJJJ stimmt nicht mit dem Format der Zeichenfolge überein ('31. Mai 2016'). – Larme

+0

@Larme, ich sehe ... jetzt lassen Sie uns die Sprache das Gerät auf Französisch ändern, wird das Format anders als 31. Mai 2016, ich denke, ich muss das Datum in Gebietsschema konvertieren ... – Lacrifilm

Antwort

2

Speichern Sie das Datum nicht als Zeichenfolge. Speichern Sie es als Offset in Sekunden ab einem Referenzdatum.

heißt:

uint64_t offset = (uint64_t)[[self.dataPicker date] timeIntervalSinceReferenceDate]; 
// store this 64-bit unsigned integer. 

Dies nimmt weniger Platz und ist schneller zu/von einem NSDate Objekt zu konvertieren.

Sie können den Offset als NSTimeInterval (64-Bit-Floating-Point-double) verlassen, wenn Sie es vorziehen, aber wie Sie nicht Datum & Zeit zu speichern, sollten uint64_t tun ...

1

Die Formatierungszeichenfolge hängt von der von Ihnen verwendeten Ländereinstellung ab. Von der localizedStringFromDate Dokumentation:

Returns String-Darstellung eines für das aktuelle Gebietsschema mit den angegebenen Datum und Uhrzeit Formatvorlagen formatiert Datum.

Diese Methode verwendet einen Datumsformatierer, der mit den aktuellen Standardeinstellungen konfiguriert ist. Der zurückgegebene String ist das gleiche wie wenn Sie konfiguriert und verwendet ein Datum Formatierer, wie im folgenden Beispiel gezeigt:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
formatter.formatterBehavior = NSDateFormatterBehavior10_4; 
formatter.dateStyle = dateStyle; formatter.timeStyle = timeStyle; 
NSString *result = [formatter stringForObjectValue:date]; 

Mittel, sollten Sie das als nächstes tun:

-(NSDate*)convertStringToDate:(NSString*)dateString { 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    dateFormatter.formatterBehavior = NSDateFormatterBehavior10_4; 
    dateFormatter.dateStyle = NSDateFormatterLongStyle; 
    dateFormatter.timeStyle = NSDateFormatterNoStyle; 
    return [dateFormatter dateFromString:dateString]; 
} 
+1

'MM' sollte für' 05' entsprechen, nicht 'Mai', nein? – Larme

+1

Richtig, jetzt, wenn mein Benutzer meine App mit anderen Orten verwendet? Wie Französisch, Japan, Portugiesisch ... dieser Code kann umgehen? (Wenn mein Picker auf Standard eingestellt ist) – Lacrifilm

+0

Ja, die Formatierungszeichenfolge sollte von dem Gebietsschema abhängen, das Sie zum Erstellen des Datums verwendet haben. Die Lösung wurde entsprechend aktualisiert. – sgl0v

1

Verwenden Sie diesen Code

,
-(NSDate*)convertStringToDate:(NSString*)date{ 
    NSString *dateString = date; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; 
    [dateFormatter setDateFormat:@"MMM d, yyyy"]; 

    return [dateFormatter dateFromString:dateString]; 
} 

hoffen, seine hilfreich