2

我在 StackOverflow 上看到了很多看起来相似的问题,但没有一个对我有帮助。

我正在解析一个 RSS 提要,并希望将日期转换为“几小时前”格式,而不是默认格式。

else if ([elementName isEqual:@"pubDate"])
    {
    currentString = [[NSMutableString alloc] init];
    NSLog(@"CURRENT STRING %@", currentString); // THIS IS RETURNING NULL IN LOGS
    [self setPubTime:currentString]; // But this statement is correctly putting the following in the label in custom tableview cell
}

上面代码的最后一行是将标签放在 tableview 的自定义单元格中,如下所示:

在此处输入图像描述

由于上面的行在 currentString 的日志中返回 NULL,我无法使用此问题中的函数(iPhone:将日期字符串转换为相对时间戳)将其转换为“小时前”格式:

有人可以指出为什么日志中的 currentString 为空,但仍然能够在下一条语句中设置标签,以及如何将其转换为几小时前的格式。

谢谢

更新:

Anupdas 的回答解决了一半的问题。现在我可以看到 currentString 在 NSLog 和自定义 tableview 单元格内的 pubTime 标签中显示时间戳。唯一剩下的就是使用这个时间戳并将它们转换为“小时/分钟/月等前”格式。

使用以下内容:

    if ([elementName isEqualToString:@"pubDate"]) {

        NSLog(@"pubTime CURRENT IS %@", currentString);
//        [self setPubTime:currentString];
        NSString *myString = [self dateDiff:currentString];
        [self setPubTime:myString];
}

这是上面代码之后的日志:

在此处输入图像描述

由于某种原因,以下功能不起作用:

 -(NSString *)dateDiff:(NSString *)origDate {
        NSDateFormatter *df = [[NSDateFormatter alloc] init];
        [df setFormatterBehavior:NSDateFormatterBehavior10_4];
        [df setDateFormat:@"EEE, dd MMM yy HH:mm:ss VVVV"];
        NSDate *convertedDate = [df dateFromString:origDate];
        [df release];
        NSDate *todayDate = [NSDate date];
        double ti = [convertedDate timeIntervalSinceDate:todayDate];
        ti = ti * -1;
        if(ti < 1) {
            return @"never";
        } else  if (ti < 60) {
            return @"less than a minute ago";
        } else if (ti < 3600) {
            int diff = round(ti / 60);
            return [NSString stringWithFormat:@"%d minutes ago", diff];
        } else if (ti < 86400) {
            int diff = round(ti / 60 / 60);
            return[NSString stringWithFormat:@"%d hours ago", diff];
        } else if (ti < 2629743) {
            int diff = round(ti / 60 / 60 / 24);
            return[NSString stringWithFormat:@"%d days ago", diff];
        } else {
            return @"never";
        }   
    }

如果有人能指出一个更好的解决方案将我的 currentString 转换为“小时/分钟/天/等格式”,请告诉我。谢谢

4

3 回答 3

4
else if ([elementName isEqual:@"pubDate"])
    {
    currentString = [[NSMutableString alloc] init];
    NSLog(@"CURRENT STRING %@", currentString); // THIS IS RETURNING NULL IN LOGS
    [self setPubTime:currentString]; // But this statement is correctly putting the following in the label in custom tableview cell
}

通过这样做,您的 pubTime 将没有任何价值。您需要在 xmlParser 的 foundCharacters 委托中初始化 currentString,然后在 didEndElement 方法中添加该值。

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    if(!currentString){
        currentString = [[NSMutableString alloc] init];
    }
    [currentString appendString:string];
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
      namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{  
     if ([elementName isEqual:@"pubDate"]){
         NSLog(@"CURRENT STRING %@", currentString);
         [self setPubTime:currentString]; 
         currentString = nil;
     }
}

而且您无需进行所有这些计算即可找到可用于此目的的分钟、小时和天数NSDateComponents。请参考这篇文章两个日期之间的差异

于 2013-04-20T14:24:38.630 回答
1

要测量小时,您可以使用此...

NSTimeInterval distanceBetweenDates = [convertedDate timeIntervalSinceDate:todayDate];
double secondsInAnHour = 3600;
NSInteger hoursBetweenDates = distanceBetweenDates / secondsInAnHour;
于 2013-04-20T15:56:01.043 回答
1

对于 Anupdas 的回答 +1,如果您有两个日期变量,您可以轻松找到差异。你需要找出一个特定的帖子是多少小时前发布的(就像你在 11 秒前的推特上看到的那样)。所以你可以使用 NSDate 的内置函数 timeIntervalSinceDate: 函数。因此,您将传递当前日期和从提要中获得的日期。您将获得一个 NSTimeInterval 对象,因此将该对象除以 60*60 将得出差异的分钟数。

使用 NSDateComponent 也是一种可行的选择。

您可以使用以下功能:

#define DATE_COMPONENTS (NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekCalendarUnit |  NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSWeekdayCalendarUnit | NSWeekdayOrdinalCalendarUnit)
#define CURRENT_CALENDAR [NSCalendar currentCalendar]

+ (NSDate* )date:(NSDate*)date ByAddingHours:(int)hours
{

    return [date dateByAddingTimeInterval:60*60*hours];
}


+ (NSDateComponents *)componentsForDate:(NSDate *)date 
{
    if (date!=nil)
    {
    NSCalendar *gregorian = [[NSCalendar alloc]
                             initWithCalendarIdentifier:NSGregorianCalendar];

    NSDateComponents *dayComponents =
    [gregorian components:DATE_COMPONENTS fromDate:date];

    return dayComponents;
    }

    return nil;
}



+(NSString *)timeFromNSDate:(NSDate *)date
{
    int hour=[self componentsForDate:date].hour;
    int minute=[self componentsForDate:date].minute;


    NSString *returnDateString=@"";
    if (hour <= 9 ) {
        returnDateString=[NSString stringWithFormat:@"0%d", hour];
    }

    else {
        returnDateString=[NSString stringWithFormat:@"%d", hour];
    }

    if (minute <= 9 ) {
        returnDateString= [returnDateString stringByAppendingFormat:@":%@", [NSString stringWithFormat:@"0%d", minute]];
    }

    else {
        returnDateString= [returnDateString stringByAppendingFormat:@":%@", [NSString stringWithFormat:@"%d", minute]];
    }

    NSLog(@"return date string: %@",returnDateString);

    return returnDateString;
}
于 2013-04-20T16:03:18.100 回答