ОС iPhone: Як створити NSDate для конкретної дати?


Відповіді:


211

@ Відповідь Чак правильна, і приведи мене до наступного коду. Думав, що я поділюсь:

NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setDay:10];
[comps setMonth:10];
[comps setYear:2010];
NSDate *date = [[NSCalendar currentCalendar] dateFromComponents:comps];

7
Примітка є також setHour, setMinute, setSecondі т.д. для більш тонкої зернистості.
devios1

19

Ви можете використовувати це

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

Сподіваюсь, це допоможе тобі.


Будьте обережні, використовуючи функцію "dateFromString" - я виявив, що з деякими ідеально дійсними датами він не може зійти з ладу. Дивіться мою публікацію нижче щодо альтернативного способу розбору рядків дати.
Майк Гледхілл

Спосіб згадки про Одеда Бен - це ще один найкращий спосіб ..... NSDateComponents * comps = [[NSDateComponents alloc] init]; [comps setDay: 10]; [comps setMonth: 10]; [comps setYear: 2010]; NSDate * date = [[NSCalendar currentCalendar] dateFromComponents: comps];
Камлешвар

16

Якщо ви говорите про конкретну дату календаря, а не про дату UNIXy, ви, мабуть, хочете NSCalendar dateFromComponents:.


9

Швидкі приклади

Приклади часто найпростіший спосіб вчитися. Ось кілька прикладів.

Тепер

Цей найпростіший.

let currentDateTime = Date()

20 лютого 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 квітня 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)

Потрібно більше деталей ...?

Є й інші способи створення дат. Якщо ви хочете дізнатися про них, а також про те, як відобразити дату, то дивіться мою більш повну відповідь .


8

Дивіться документацію для NSDate . Ви можете використовувати dateFromString:метод NSDateFormatterабо dateFromComponents:метод NSCalendar.


Я продовжую отримувати цю дату: "1969-12-31 16:00:00" -0800 при використанні дати з рядка
nickthedude

NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init]; NSDate * captureStartDate = [dateFormatter dateFromString: @ "2 січня 2001 р.]]; NSLog (@ "% @", [опис захопленогоStartDate]); вихід: 2010-04-05 10: 49: 47.688 Календар2 [21339: 207] 1969-12-31 16:00:00 -0800
nickthedude

Можливо, вам потрібно встановити деякі параметри на форматовану дату замість простої init?
zoul

3

Я знайшов цю тему, шукаючи відповідь на це запитання, але потім знайшов хороший приклад в одній моїй книзі програмування «Великий нерв-ранчо». Кредит їм, а не мені.

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

2

Це смішно, чи не так?

Середина 2013 року та Apple досі не запропонували простий спосіб встановити значення NSDate.

Під час мого поточного проекту iPad я не міг повірити, що мені доведеться на деякий час зупинити продуктивність, щоб написати власний клас помічників, щоб отримати значення року від NSDate. Я маю на увазі, давай, це основні речі.

У будь-якому випадку, ось клас хелперів, який я використовував у своєму проекті, щоб перетворити рядок у значення 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

Використовуючи цей код, ви можете встановити значення NSDate, використовуючи щось на зразок:

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

Примітка. Ця функція ґрунтувалася на коді, взятому звідси: https://stackoverflow.com/a/3968411/391605

Моїм рішенням було використання наступного коду, але я виявив, що іноді він просто не буде розбиратися, і поверне нуль .

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

Я пам’ятаю, що він невдало провалився 12 жовтня 2012 року ... саме тому я відмовився від використання складнішої функції «parseDateString», показаної вище.

Моя думка ... будьте обережні.

Деякі дуже основні функції NSDate просто не працюють належним чином ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.