从unix时间戳获取人类可读的相对时间和日期?

can*_*boy 4 iphone objective-c nsdate ios

从像1290529723这样的unix时间戳开始,我将如何(假设gmt)获取有关它是否为的信息:

  • 今天(如果是的话,什么时间)

  • 在过去七天(如果是这样,哪一天......周一,周二等?)

  • 超过一周(如果是这样,如何以dd/mm/yy格式输出?)

我需要这个消息列表,如iPhone的邮件应用程序,其中日期/时间显示相对于当前日期和时间,如下所示:

15:45
Yesterday
Sunday
Saturday
10/10/10
Run Code Online (Sandbox Code Playgroud)

等等

 

Amo*_*hua 9

获得一个尊重设备区域设置的解决方案需要一些小小的尝试.以下方法relativeStringFromDate返回表示日期的字符串,格式如下:

  • 根据当地情况(例如'3:40 PM'或'15:40'),如果日期是今天的时间
  • "昨天",如果日期是昨天(但将国际化为语言环境的语言)
  • 如果日期是2到6天前的星期几的名称(例如'星期一','星期二'等,再次根据语言环境的语言)
  • 根据当地情况,如果日期超过一周,则只是日期组件(例如,美国的'1/20/2012'与欧洲的'20/1/2012')

    - (NSString *)relativeStringFromDate:(NSDate *)date {
        if ([self dateIsToday:date])
            return [self dateAsStringTime:date];
        else if ([self dateIsYesterday:date])
            return [self dateAsStringDate:date];
        else if ([self dateIsTwoToSixDaysAgo:date])
            return [self dateAsStringDay:date];
        else
            return [self dateAsStringDate:date];
    }
    
    - (BOOL)date:(NSDate *)date 
            isDayWithTimeIntervalSinceNow:(NSTimeInterval)interval {
        NSDateFormatter *df = [[NSDateFormatter alloc] init];
        [df setDateFormat:@"yyyy-MM-dd"];
    
        NSDate *other_date;
        other_date = [NSDate dateWithTimeIntervalSinceNow:interval];
    
        NSString *d1, *d2;
        d1 = [df stringFromDate:date];
        d2 = [df stringFromDate:other_date];
        return [d1 isEqualToString:d2];    
    }
    
    - (BOOL)dateIsToday:(NSDate *)date {
        return [self date:date isDayWithTimeIntervalSinceNow:0];
    }
    
    - (BOOL)dateIsYesterday:(NSDate *)date {
        return [self date:date isDayWithTimeIntervalSinceNow:-86400];
    }
    
    - (BOOL)dateIsTwoToSixDaysAgo:(NSDate *)date {
        for (int i = 2; i <= 6; i += 1)
            if ([self date:date isDayWithTimeIntervalSinceNow:i*-86400])
                return YES;
        return NO;    
    }
    
    - (NSString *)dateAsStringDate:(NSDate *)date {
        NSDateFormatter *df = [[NSDateFormatter alloc] init];
        [df setDateStyle:NSDateFormatterShortStyle];
        [df setDoesRelativeDateFormatting:YES];
        NSString *str = [df stringFromDate:date];
        return str;
    }
    
    - (NSString *)dateAsStringTime:(NSDate *)date {
        NSDateFormatter *df = [[NSDateFormatter alloc] init];
        [df setTimeStyle:NSDateFormatterShortStyle];
        NSString *str = [df stringFromDate:date];
        return str;
    }
    
    - (NSString *)dateAsStringDay:(NSDate *)date {
        NSDateFormatter *df = [[NSDateFormatter alloc] init];
        [df setDateFormat:@"EEEE"];
        NSString *str_day = [df stringFromDate:date];
        return str_day;
    }
    
    Run Code Online (Sandbox Code Playgroud)

正如您和Brad的回答中提到的,您可以使用NSDate的dateWithTimeIntervalSince1970从时间戳中获取NSDate.