NSDate от NSString - PullRequest
       14

NSDate от NSString

6 голосов
/ 28 февраля 2010

Я прочитал руководство по форматированию даты и все еще не могу получить работающий форматер.

NSString *string = @"0901Z 12/17/09";   
//This is a sample date. The Z stands for GMT timezone
//The 0901 is 09h 01m on a 24 hour clock not 12.
//As long as I can get the hours/min & date from the string I can deal with the time zone later
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setDateFormat:@"hhmm'Z' MM/dd/yy"];
NSDate *date = [dateFormat dateFromString:string];

Ответы [ 2 ]

7 голосов
/ 28 февраля 2010

Это работает для меня, когда я пытаюсь это сделать. Добавление NSLog(@"%@", date) в конец вашего кода дает мне такой вывод:

2010-02-28 12:17:22.921 app[9204:a0f] 2009-12-17 09:01:00 -0800

Какую проблему вы видите?

Редактировать: Я понял, у вас нет проблем с 09:01, но с другими 24-часовыми периодами, как 14:25, верно? Измените свой форматер на:

@"HHmm'Z' MM/dd/yy"
2 голосов
/ 06 мая 2011

Скопировано из аналогичного вопроса, на который я ответил здесь: NSDateFormatter возвращает nil для @ "dd-MM-yy" в iOS 3.0

Если вы работаете с видимыми пользователем датами, вам следует избегать установки строки формата даты. Форматирование дат таким способом не локализуемо и не позволяет предсказать, как ваша строка формата будет выражена во всех возможных пользовательских конфигурациях. Скорее, вы должны попытаться ограничить себя настройкой даты и времени (через - [NSDateFormatter setDateStyle:] и - [NSDateFormatter setTimeStyle:]).

С другой стороны, если вы работаете с датами фиксированного формата, вы должны сначала установить для локали форматера даты нечто подходящее для вашего фиксированного формата. В большинстве случаев лучшим языком для выбора является en_US_POSIX, язык, специально разработанный для получения результатов на английском языке США, независимо от пользовательских и системных предпочтений. «en_US_POSIX» также инвариантен во времени (если США в какой-то момент в будущем изменят способ форматирования дат, «en_US» изменится, чтобы отразить новое поведение, но «en_US_POSIX» не будет), и между компьютерами ( «en_US_POSIX» работает на iPhone OS так же, как на Mac OS X и на других платформах).

После того, как вы установили en_US_POSIX в качестве локали форматера даты, вы можете установить строку формата даты, и форматер даты будет работать согласованно для всех пользователей.

Приведенную выше информацию и многое другое можно найти в Apple Технические вопросы и ответы QA1480

Вот фрагмент кода из моего приложения, который реализует приведенную выше рекомендацию:

static NSDateFormatter* dateFormatter = nil;
if (!dateFormatter) {
dateFormatter = [[NSDateFormatter alloc] init];
NSLocale *enUSPOSIXLocale = [[[NSLocale alloc] 
             initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];
NSAssert(enUSPOSIXLocale != nil, @"POSIX may not be nil.");
[dateFormatter setLocale:enUSPOSIXLocale];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

dateFormatter.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss +0000";
}
...