iPhone OS: Wie erstelle ich ein NSDate für ein bestimmtes Datum?

98

Scheint eine einfache Sache zu sein, aber ich kann anscheinend keinen Weg finden, dies zu tun.

Es wäre toll, ein paar verschiedene Methoden zu sehen.

nickthedude
quelle

Antworten:

211

@ Chucks Antwort ist richtig und führt mich zum folgenden Code. Ich dachte, ich würde teilen:

NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setDay:10];
[comps setMonth:10];
[comps setYear:2010];
NSDate *date = [[NSCalendar currentCalendar] dateFromComponents:comps];
Oded Ben Dov
quelle
7
Hinweis gibt es auch setHour, setMinute, setSecondetc. für eine feinere Körnung.
Devios1
19

Sie können dies verwenden

NSString *dateString = @"03-Sep-11";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"dd-MMM-yy";
NSDate *date = [dateFormatter dateFromString:dateString];

Hoffe das wird dir helfen.

Kamleshwar
quelle
Seien Sie vorsichtig mit der Funktion "dateFromString" - ich habe festgestellt, dass es bei einigen perfekt gültigen Daten kläglich fehlschlagen würde. In meinem Beitrag unten finden Sie eine alternative Methode zum Parsen von Datumszeichenfolgen.
Mike Gledhill
Die Art und Weise, wie Oded Ben erwähnt, ist auch eine andere beste Art ..... NSDateComponents * comps = [[NSDateComponents alloc] init]; [comps setDay: 10]; [comps setMonth: 10]; [comps setYear: 2010]; NSDate * date = [[NSCalendar currentCalendar] dateFromComponents: comps];
Kamleshwar
16

Wenn Sie über ein bestimmtes Kalenderdatum und nicht über ein UNIXy-Datum sprechen, möchten Sie wahrscheinlich NSCalendar dateFromComponents:.

Futter
quelle
9

Schnelle Beispiele

Beispiele sind oft der einfachste Weg zu lernen. Hier einige Beispiele.

Jetzt

Dieser ist der einfachste.

let currentDateTime = Date()

20. Februar 2017

// Specify date components
var dateComponents = DateComponents()
dateComponents.year = 2017
dateComponents.month = 2
dateComponents.day = 20

// Create date from components
let userCalendar = Calendar.current // user calendar
let dateThisPostWasUpdated = userCalendar.date(from: dateComponents)

1. April 1976

// Specify date components
var dateComponents = DateComponents()
dateComponents.year = 1976
dateComponents.month = 4
dateComponents.day = 1

// Create date from components
let userCalendar = Calendar.current // user calendar
let appleFoundedDate = userCalendar.date(from: dateComponents)

Benötigen Sie weitere Details ...?

Es gibt auch andere Möglichkeiten, Daten zu erstellen. Wenn Sie diese lernen und ein Datum anzeigen möchten, lesen Sie meine ausführlichere Antwort .

Suragch
quelle
8

Siehe die Dokumentation zu NSDate . Sie können die dateFromString:Methode von NSDateFormatteroder die dateFromComponents:Methode von verwenden NSCalendar.

Zoul
quelle
Ich bekomme immer dieses Datum: "1969-12-31 16:00:00" -0800 bei Verwendung von Datum aus Zeichenfolge
nickthedude
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init]; NSDate * captureStartDate = [dateFormatter dateFromString: @ "2. Januar 2001"]; NSLog (@ "% @", [CaptureStartDate-Beschreibung]); Ausgabe: 2010-04-05 10: 49: 47.688 Calendar2 [21339: 207] 1969-12-31 16:00:00 -0800
nickthedude
Möglicherweise müssen Sie einige Parameter für das formatierte Datum festlegen, anstatt einfach init?
Zoul
3

Ich habe diesen Thread gefunden, als ich nach einer Antwort auf diese Frage gesucht habe, aber dann habe ich ein gutes Beispiel in einem meiner Big Nerd Ranch Objective-C-Programmierbücher gefunden. Gutschrift an sie, nicht an mich.

  NSDateComponents *myBDay  =[[NSDateComponents alloc] init];
    [myBDay setDay:22];
    [myBDay setMonth: 04];
    [myBDay setYear: 1984];
    [myBDay setHour:9];
    [myBDay setMinute:25];
    [myBDay setSecond:35];

    NSCalendar *g = [[ NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    NSDate *dateOfBirth = [g dateFromComponents:myBDay];
Lev Chlumov
quelle
2

Es ist lächerlich, nicht wahr?

Mitte 2013 und Apple immer noch nicht eine einfache Art und Weise zur Verfügung gestellt einen NSDate Wert einzustellen.

Während meines aktuellen iPad-Projekts konnte ich nicht glauben, dass ich die Produktivität für eine Weile einstellen musste, um meine eigene Hilfsklasse zu schreiben und den Jahreswert von einem NSDate zu erhalten. Ich meine, komm schon, das ist grundlegendes Zeug.

Hier ist die Hilfsklasse, die ich in meinem Projekt verwendet habe, um eine Zeichenfolge in einen NSDate-Wert zu konvertieren:

@implementation DateHelper

+(NSDate*)parseDateString:(NSString *)dateString
{
    NSDateFormatter *rfc3339TimestampFormatterWithTimeZone = [[NSDateFormatter alloc] init];
    [rfc3339TimestampFormatterWithTimeZone setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
    [rfc3339TimestampFormatterWithTimeZone setDateFormat:@"MMM dd, yyyy"];

    NSDate *theDate = nil;
    NSError *error = nil;
    if (![rfc3339TimestampFormatterWithTimeZone getObjectValue:&theDate forString:dateString range:nil error:&error]) {
        NSLog(@"Date '%@' could not be parsed: %@", dateString, error);
    }

    return theDate;
}

@end

Mit diesem Code können Sie einen NSDate-Wert festlegen, indem Sie Folgendes verwenden:

NSDate* date = [DateHelper parseDateString:@"Jul 16, 2013"];

Hinweis: Diese Funktion basiert auf dem Code von hier: https://stackoverflow.com/a/3968411/391605

Meine Lösung bestand darin , den folgenden Code zu verwenden, aber ich stellte fest, dass er manchmal einfach nicht analysiert wurde und null zurückgab .

//  Take a date string in the format "Oct 23, 2013", and convert it into a NSDate value
//  THIS DOESN'T WORK !  DON'T TRUST THIS CODE !!
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MMM dd, yyyy"];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

NSDate* date = [formatter dateFromString:dateString];

Ich erinnere mich, dass es am "12. Oktober 2012" kläglich gescheitert ist ... weshalb ich aufgegeben und die oben gezeigte kompliziertere "parseDateString" -Funktion verwendet habe.

Mein Punkt ist ... sei vorsichtig.

Einige der sehr grundlegenden NSDate-Funktionen funktionieren einfach nicht richtig ...

Mike Gledhill
quelle