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

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

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

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

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

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

15:45 Yesterday Sunday Saturday 10/10/10 

等等

获得尊重设备区域设置的解决scheme需要一点小窍门。 下面的方法relativeStringFromDate返回一个表示date的string,格式如下:

  • 根据当地情况(例如'3:40 PM'或'15:40'),如果date是今天的时间
  • 如果date是昨天,那么“昨天”(但是将被国际化为语言环境的语言)
  • 如果date是两至六天前,那么星期几的名称(例如,“星期一”,“星期二”等等,根据语言环境的语言)
  • 只是date部分,如果date超过一个星期前,根据区域(例如'2012年1月20日'在欧洲'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; } 

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

我使用这种方法将unix时间戳变成了一个很好的可读的相对string。 在新的一年的前几天可能不能正常工作,但希望你应该过于注意。

 -(NSString *)relativeTime:(int)datetimestamp { NSDate *aDate = [NSDate dateWithTimeIntervalSince1970:datetimestamp]; NSCalendar *calendar = [NSCalendar currentCalendar]; unsigned int unitFlags = NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayOrdinalCalendarUnit|NSWeekdayCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit; NSDateComponents *messageDateComponents = [calendar components:unitFlags fromDate:aDate]; NSDateComponents *todayDateComponents = [calendar components:unitFlags fromDate:[NSDate date]]; NSUInteger dayOfYearForMessage = [calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:aDate]; NSUInteger dayOfYearForToday = [calendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:[NSDate date]]; NSString *dateString; if ([messageDateComponents year] == [todayDateComponents year] && [messageDateComponents month] == [todayDateComponents month] && [messageDateComponents day] == [todayDateComponents day]) { dateString = [NSString stringWithFormat:@"%02d:%02d", [messageDateComponents hour], [messageDateComponents minute]]; } else if ([messageDateComponents year] == [todayDateComponents year] && dayOfYearForMessage == (dayOfYearForToday-1)) { dateString = @"Yesterday"; } else if ([messageDateComponents year] == [todayDateComponents year] && dayOfYearForMessage > (dayOfYearForToday-6)) { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"EEEE"]; dateString = [dateFormatter stringFromDate:aDate]; [dateFormatter release]; } else { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yy"]; dateString = [NSString stringWithFormat:@"%02d/%02d/%@", [messageDateComponents day], [messageDateComponents month], [dateFormatter stringFromDate:aDate]]; [dateFormatter release]; } return dateString; } 

我个人喜欢github上的https://github.com/kevinlawler/NSDate-TimeAgo库&#x3002; 它只有两个文件,使用起来非常简单。 它也有本地化,如果你想!

NSDateFormatter类有你所需要的。 它通过doRelativeDateFormatting方法做“今天”,“明天”等。

希望能够帮助别人在这里降落,不想使用外部课堂或创build自己的课堂。

这里有一个库:mattt的FormatterKit中的TTTTimeIntervalFormatter 🙂

将其转换为NSDate:

 + (id)dateWithTimeIntervalSince1970:(NSTimeInterval)seconds 

然后与其他date比较:

 * – compare: * – earlierDate: * – isEqual: (NSObject protocol) * – laterDate: