iPhone OS: Jak utworzyć NSDate dla określonej daty?

Odpowiedzi:

211

@ Odpowiedź Chucka jest poprawna i poprowadź mnie do następującego kodu. Pomyślałem, że podzielę się:

NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setDay:10];
[comps setMonth:10];
[comps setYear:2010];
NSDate *date = [[NSCalendar currentCalendar] dateFromComponents:comps];
Oded Ben Dov
źródło
7
Uwaga jest też setHour, setMinute, setSecond, itd. Dla drobniejszej ziarnistości.
devios1
19

Możesz tego użyć

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

Mam nadzieję, że to ci pomoże.

Kamleshwar
źródło
Uważaj, używając funkcji „dateFromString” - stwierdziłem, że przy niektórych całkowicie poprawnych datach zakończy się to żałosnym niepowodzeniem. Zobacz mój post poniżej, aby zapoznać się z alternatywnym sposobem analizowania ciągów dat.
Mike Gledhill,
Sposób, w jaki Oded Ben wspomina, jest również innym najlepszym sposobem ..... NSDateComponents * comps = [[NSDateComponentsocation] init]; [comps setDay: 10]; [comps setMonth: 10]; [komps setYear: 2010]; NSDate * date = [[NSCalendar currentCalendar] dateFromComponents: comps];
Kamleshwar
16

Jeśli mówisz o konkretnej dacie kalendarzowej, a nie o dacie w systemie UNIXy, prawdopodobnie potrzebujesz NSCalendar dateFromComponents:.

Głaskanie pod brodę
źródło
9

Szybkie przykłady

Przykłady są często najłatwiejszym sposobem nauczenia się. Oto kilka przykładów.

Teraz

Ten jest najłatwiejszy.

let currentDateTime = Date()

20 lutego 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 kwietnia 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)

Potrzebujesz więcej informacji ...?

Istnieją również inne sposoby tworzenia dat. Jeśli chcesz się tego nauczyć, a także jak wyświetlić datę, zobacz moją pełniejszą odpowiedź .

Suragch
źródło
8

Zobacz dokumentację NSDate . Możesz użyć dateFromString:metody NSDateFormatterlub dateFromComponents:metody NSCalendar.

zoul
źródło
Ciągle otrzymuję tę datę: „1969-12-31 16:00:00” -0800, gdy używam daty z ciągu
nickthedude
NSDateFormatter * dateFormatter = [[NSDateFormatter przydziel] init]; NSDate * capturedStartDate = [dateFormatter dateFromString: @ "2 stycznia 2001"]; NSLog (@ "% @", [opis przechwyconej datyStartu]); wyjście: 2010-04-05 10: 49: 47.688 Kalendarz2 [21339: 207] 1969-12-31 16:00:00
-0800
Może potrzebujesz ustawić niektóre parametry w formacie daty zamiast zwykłego init?
zoul
3

Znalazłem ten wątek, szukając odpowiedzi na to pytanie, ale potem znalazłem dobry przykład w jednej z moich książek Big Nerd Ranch Objective-C Programming. Chwała im, nie mnie.

  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
źródło
2

To śmieszne, prawda?

W połowie 2013 r. Firma Apple nadal nie zapewniła prostego sposobu ustawiania wartości NSDate.

Podczas mojego obecnego projektu na iPada nie mogłem uwierzyć, że muszę na chwilę zatrzymać produktywność, aby napisać własną klasę pomocniczą, aby uzyskać wartość roku z NSDate. To znaczy, daj spokój, to podstawowe rzeczy.

W każdym razie, oto klasa pomocnicza, której użyłem w moim projekcie, aby przekonwertować ciąg na wartość NSDate:

@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

Używając tego kodu, możesz ustawić wartość NSDate używając czegoś takiego:

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

Uwaga: ta funkcja została oparta na kodzie pobranym stąd: https://stackoverflow.com/a/3968411/391605

Moim rozwiązaniem było użycie następującego kodu, ale stwierdziłem, że czasami po prostu nie mógł przeanalizować i zwrócił nil .

//  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];

Pamiętam, że nie powiodło się to marnie w dniu „12 października 2012 r.”… Dlatego zrezygnowałem i skorzystałem z bardziej skomplikowanej funkcji „parseDateString” pokazanej powyżej.

Chodzi mi o to ... bądź ostrożny.

Niektóre z bardzo podstawowych funkcji NSDate po prostu nie działają poprawnie ...

Mike Gledhill
źródło