- [NSDateFormatter dateFromString:] возвращает ноль - PullRequest
2 голосов
/ 23 мая 2011
    NSString *lower = [NSString stringWithFormat:@"%@",[newDates objectAtIndex:0]];
    NSString *higher = [NSString stringWithFormat:@"%@",[newDates objectAtIndex:[newDates count]-1]];
    NSLog(@"%@",lower);
    NSLog(@"%@",higher);

    NSDateFormatter *df = [[NSDateFormatter alloc] init];
    [df setDateFormat:@"yyyy-MM-dd"];
    NSDate *dtLower = [df dateFromString:lower];

    NSDate *dtHigher = [df dateFromString:higher];
    [df release];
    NSDateFormatter *df1 = [[NSDateFormatter alloc] init];
    [df1 setDateFormat:@"yyyy-MM-dd"];
    NSString * lowerDate = [df1 stringFromDate:dtLower];
    NSString * higherDate = [df1 stringFromDate:dtHigher];
    UILabel *dateLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 31, self.view.frame.size.width, 30)];
    [dateLabel setTextColor:[UIColor grayColor]];
    dateLabel.text = [NSString stringWithFormat:@"%@ - %@",lowerDate,higherDate];
    [self.view addSubview:dateLabel];

Вывод lower и higher в консоли:

2011-05-23 14:55:52.767 Vocab[4225:207] 2011-05-23 03:58:22
2011-05-23 14:55:53.781 Vocab[4225:207] 2011-05-23 07:14:56

Здесь приведенный выше код не работает для меня.Значения higher и lower не равны NULL, но когда я пытаюсь преобразовать его в NSDate с использованием NSDateFormatter, он возвращает nil.

Итак dtLower и dtHigher возвращают nil

Что может быть не так?

Ответы [ 3 ]

8 голосов
/ 23 мая 2011

Попробуйте установить [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

3 голосов
/ 23 мая 2011

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

. Если вы работаете с фиксированным форматом дат , вам следует сначалазадайте для локали форматера даты что-то подходящее для вашего фиксированного формата. В большинстве случаев лучшим языком для выбора является en_US_POSIX, локаль, специально разработанная для получения результатов на английском языке США, независимо от пользовательских и системных предпочтений. en_US_POSIX - этотакже инвариантен во времени и между машинами (en_US_POSIX работает на iOS так же, как на OSX и на других платформах).

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

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

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

static NSDateFormatter* dateFormatter = nil;
if (!dateFormatter) 
{
   dateFormatter = [NSDateFormatter new];

   NSLocale *enUSPOSIXLocale = [[NSLocale alloc]  
                                 initWithLocaleIdentifier:@"en_US_POSIX"];

   [dateFormatter setLocale:enUSPOSIXLocale];
   [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
   dateFormatter.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss +0000";
}
3 голосов
/ 23 мая 2011
 [df setDateFormat:@"yyyy-MM-dd hh:mm:ss"];

Ваш первый формат даты неправильный.

...