NSString to NSDate - PullRequest
       40

NSString to NSDate

38 голосов
/ 30 августа 2009

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

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. Что я делаю не так?

Ответы [ 5 ]

64 голосов
/ 30 августа 2009

Вы не можете придумать синтаксис строки формата и ожидать, что он будет работать; вам действительно нужно использовать документированный формат. (Серьезно, «ММ» означает «месяц», «минута» и «минуты смещения по Гринвичу» все одновременно?)

Как указано в документации , в форматерах 10.4 используются строки формата Unicode .

Вместо этого попробуйте "гггг-ММ-дд ЧЧ: мм: сс ZZZ".

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

7 голосов
/ 08 октября 2010

Кроме того, 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 голосов
/ 03 июля 2013

Сделано расширение 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; }];
2 голосов
/ 10 апреля 2013

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

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

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

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

0 голосов
/ 09 августа 2012

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

На основе Apple Справочник по классам NSDateFormatter Документация

Есть много атрибутов, которые вы можете получить и установить на дату стиля форматер , ... Тем не менее, не рекомендуется изменять индивидуальные настройки . Вместо этого вы должны принять настройки по умолчанию, установленные при инициализации, и указать формат , используя 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 Docs для различных стилей NSDateFormatterStyle или этого превосходного учебника

...