Использование NSDateFormatter для преобразования NSString во время Unix - код работает 50% времени - PullRequest
2 голосов
/ 03 сентября 2010

Это действительно странно, я не уверен, что может заставить код работать идеально в половине случаев, а не в другой половине. Я использую TBXML для анализа твиттера. Мне нужно получить дату create_at в твиттере, которая передается как <created_at>Tue Feb 02 23:30:49 +0000 2010</created_at>. Поэтому я сохраняю эти значения и затем передаю каждое из них моему методу getTweetTime, который отформатирует их, получит их в unix-формате, а затем сравнит с текущей датой, чтобы вернуть строку, аналогичную твиттерам "около 3 часов назад структура даты.

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

    -(NSString *) getTweetTime:(NSString*)time
{       
    NSDateFormatter *df = [[[NSDateFormatter alloc] init] autorelease];
    [df setDateFormat:@"ccc MMM dd hh:mm:ss Z yyyy"];
    NSDate *myDate = [df dateFromString: time];


    NSLog(@"time%@", time);
    long tweetTime =  (long)[myDate timeIntervalSince1970];
    long currentTime = (long)[[NSDate date] timeIntervalSince1970]; 

    int delta = currentTime - tweetTime;    
    NSLog(@"tweet:%ld, current:%ld", tweetTime, currentTime);

    if (delta < 60) {
        return @" (less than a minute ago)";
    } else if (delta < 120) {
        return @" (about a minute ago)";
    } else if (delta < (60 * 60)) {
        return [[NSString stringWithFormat:@" ( about %u",(delta / 60)] stringByAppendingString:@" minutes ago)"];
    } else if (delta < (120 * 60)) {
        return @" (about an hour ago)";
    } else if (delta < (24 * 60 * 60)) {        
        return [[NSString stringWithFormat:@" (about %u",((delta / 3600) - 1)] stringByAppendingString:@" hours ago)"];
    } else if (delta < (48 * 60 * 60)) {
        return @" (1 day ago)";
    } 
    else if(tweetTime == 0){return @"********";}
    else {
        return [[NSString stringWithFormat:@" (%u",(delta / 86400)] stringByAppendingString:@" days ago)"];
    }    

}

Кажется, что между тем, что каждый раз успешно разбирается, нет никаких закономерностей. Вот типичный вывод консоли: 1 успех, 1 сбой, где время = 0 - сбой:

2010-09-02 14:45:12.963 myApp[6401:307] timeTue Aug 31 17:59:34 +0000 2010
2010-09-02 14:45:12.964 myApp[6401:307] tweet:0, current:1283463912
2010-09-02 14:45:12.970 myApp[6401:307] timeTue Aug 31 06:36:29 +0000 2010
2010-09-02 14:45:12.972 myApp[6401:307] tweet:1283236589, current:1283463912

Я также пытался добавить несколько Z в строку, но безрезультатно.

1 Ответ

2 голосов
/ 03 сентября 2010

Попробуйте использовать верхний регистр ЧЧ для часа. Стандарт гласит: «h» - час с 1 до 12. Вы заметите, что ваш пример "терпит неудачу" имеет 17 часов.

...