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 の回答により、問題の半分が解決されました。これで、NSLog とカスタム テーブルビュー セル内の pubTime ラベルの両方にタイムスタンプを示す currentString が表示されます。残っている唯一のことは、このタイムスタンプを使用して、それらを「時間/分/月など」の形式に変換することです。

以下を使用します。

    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

1

Anupdas の回答に +1、日付変数が 2 つある場合は、違いを簡単に見つけることができます。特定の投稿が何時間前に作成されたかを調べる必要があります (11 秒前の Twitter などで見られるように)。したがって、NSDate の組み込み関数 timeIntervalSinceDate: 関数を使用できます。したがって、現在の日付とフィードから取得した日付を渡します。NSTimeInterval オブジェクトを取得するので、そのオブジェクトを 60*60 で割ると、差が分数になります。

NSDateComponent を使用することも、実行可能なオプションの 1 つです。

次の関数を利用できます。

#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 に答える
1

これを使用できる時間を測定するには...

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