iPhone OS: как создать 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 05

19

Вы можете использовать это

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

Надеюсь, это поможет вам.


Будьте осторожны при использовании функции dateFromString - я обнаружил, что с некоторыми совершенно действительными датами она с треском провалилась. См. Мой пост ниже, чтобы узнать об альтернативном способе разбора строк даты.
Mike Gledhill

Упоминание Одеда Бена - еще один лучший способ ..... 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] инициализация]; NSDate * captureStartDate = [dateFormatter dateFromString: @ "2 января 2001 г."]; NSLog (@ "% @", [описание captureStartDate]); вывод: 2010-04-05 10: 49: 47.688 Calendar2 [21339: 207] 1969-12-31 16:00:00 -0800
nickthedude

Может быть, вам нужно установить какие-то параметры на дату в формате, а не в обычном формате init?
zoul

3

Я нашел эту ветку, когда искал ответ на этот вопрос, но затем я нашел хороший пример в одной моей книге по программированию Big Nerd Ranch Objective-C. Спасибо им, а не мне.

  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

Мое решение заключалось в использовании следующего кода, но я обнаружил, что иногда он просто не разбирается и возвращает 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];

Я помню, что он с треском провалился 12 октября 2012 года ... вот почему я отказался и использовал более сложную функцию parseDateString, показанную выше.

Я хочу сказать ... будьте осторожны.

Некоторые из самых простых функций NSDate просто не работают должным образом ...

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.