Подтвердить что ты не робот

NSString для NSDate

Я получил строку, которая содержит текущую дату, используя это:

NSString *date = [[NSDate date] description];

В другой точке я хочу получить дату из этой строки, и я использовал следующий код:

[NSDateFormatter setDefaultFormatterBehavior:NSDateFormatterBehavior10_4];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
//[NSDateFormatter setDefaultFormatterBehavior:NSDateFormatterBehaviorDefault];
[dateFormatter setDateFormat:@"YYYY-MM-DD HH:MM:SS ±HHMM"];

NSDate *dateFromString = [[NSDate alloc] init];
dateFromString = [dateFormatter dateFromString:<NSString containing date>];

Я получаю dateFromString как nil 0x0. Что я делаю неправильно?

4b9b3361

Ответ 1

Вы не можете придумать синтаксис строки формата и ожидать, что он будет работать; вам необходимо использовать документированный формат. (Серьезно, "ММ" означает "месяц", "минута" и "GMT offset minutes" одновременно)

Как указывает documentation, форматы 10.4 используют Unicode форматирование строк.

Попробуйте "yyyy-MM-dd HH: mm: ss ZZZ".

Кроме того, источником Objective-C является ASCII. Не помещайте туда символы, как ±, и ожидайте, что они будут работать в любом контексте; вместо этого используйте файлы строк.

Ответ 2

Кроме того, dateFromString: возвращает автореализованный NSDate, поэтому:

NSDate *dateFromString = [[NSDate alloc] init]; // <- non freed instance
dateFromString = [dateFormatter dateFromString:<NSString containing date>]; // <- new autoreleased instance
....
[dateFromString release]; // <- wrong

Вы можете:

//NSDate *dateFromString = [[NSDate alloc] init];
NSDate *dateFromString = [dateFormatter dateFromString:<NSString containing date>];
....
//[dateFromString release]; // dateFromString is autoreleased

Надеюсь, это может спасти кого-то:)

Ответ 3

Вы можете проверить TouchTime.

https://github.com/jheising/TouchTime.

Это прямой порт awesome strtotime функции в PHP в 5.4 для Cocoa и iOS. Это займет почти любой произвольный формат даты или времени и преобразует его в NSDate.

Надеюсь, что он работает, и наслаждайтесь!

Ответ 4

Создал расширение NSString.

// Simple as this.   
date = dateString.dateValue;

Благодаря NSDataDetector он распознает много формата.

// Tested in GMT+1 (Hungary).
@"2014-01-16" dateValue is <2014-01-16 11:00:00 +0000>
@"2014.01.16" dateValue is <2014-01-16 11:00:00 +0000>
@"2014/01/16" dateValue is <2014-01-16 11:00:00 +0000>
@"2014 Jan 16" dateValue is <2014-01-16 11:00:00 +0000>
@"2014 Jan 16th" dateValue is <2014-01-16 11:00:00 +0000>
@"20140116" dateValue is <2014-01-16 11:00:00 +0000>
@"01-16-2014" dateValue is <2014-01-16 11:00:00 +0000>
@"01.16.2014" dateValue is <2014-01-16 11:00:00 +0000>
@"01/16/2014" dateValue is <2014-01-16 11:00:00 +0000>
@"16 January 2014" dateValue is <2014-01-16 11:00:00 +0000>
@"01-16-2014 17:05:05" dateValue is <2014-01-16 16:05:05 +0000>
@"01-16-2014 T 17:05:05 UTC" dateValue is <2014-01-16 17:05:05 +0000>
@"17:05, 1 January 2014 (UTC)" dateValue is <2014-01-01 16:05:00 +0000>

Часть eppz! kit, возьмите категорию NSString + EPPZKit. h от GitHub.


ОРИГИНАЛЬНЫЙ ОТВЕТ: Если вы не уверены (или просто не заботитесь) о формате даты, содержащемся в строке, используйте NSDataDetector для синтаксического анализа даты.

//Role players.
NSString *dateString = @"Wed, 03 Jul 2013 02:16:02 -0700";
__block NSDate *detectedDate;

//Detect.
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingAllTypes error:nil];
[detector enumerateMatchesInString:dateString
                           options:kNilOptions
                             range:NSMakeRange(0, [dateString length])
                        usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop)
{ detectedDate = result.date; }];

Ответ 5

Как уже было сказано, это происходит, когда вы изобретаете новый ситакс.

На основе Apple Ссылка на класс NSDateFormatter

Есть много атрибутов, которые вы можете получить и установить на дату стиля formatter,... Однако вам рекомендуется не изменять индивидуальные настройки. Вместо этого вы должны принять настройки по умолчанию, установленные при инициализации, и указать формат, используя setDateStyle:, setTimeStyle:

Это особенно важно для вывода, который отличается для каждой локали. По умолчанию NSDateFormatter наблюдает за настройками локального пользователя. Таким образом, тот же NSDate может быть 22.11.2011 18:33:19 или Nov 22, 2011 6:33:19 PM, или 2011-11-22 下午6:33:19 или даже २२-११-२०११ ६:३३:१९ अपराह्, все для одного и того же ввода и с тем же кодом.

Рассмотрим, например, этот код

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

[dateFormatter setDateStyle:NSDateFormatterShortStyle];
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];

// ShortStyle used: 11/23/37 3:30pm
NSString *dateString = [dateFormatter stringFromDate:date];

Проверьте документы Apple для разных стилей NSDateFormatterStyle или отличный учебник