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

标签 iphone objective-c ios nsdate

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

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

  • 在过去的 7 天内(如果是,那一天……周一, 星期二等?)

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

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

15:45
Yesterday
Sunday
Saturday
10/10/10

等等

最佳答案

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

  • 如果日期是今天,则只显示时间,根据语言环境(例如“3:40PM”或“15:40”)
  • 如果日期是昨天,则为“昨天”(但会国际化为区域设置的语言)
  • 星期几的名称,如果日期是两到六天前(例如“星期一”、“星期二”等,同样根据区域设置的语言)
  • 如果日期超过一周前,则仅包含日期部分,具体取决于区域设置(例如,美国为“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;
    }
    

如您和 Brad 的回答中所述,您可以使用 NSDate 的 dateWithTimeIntervalSince1970 从时间戳中获取 NSDate。

关于iphone - 从 unix 时间戳获取人类可读的相对时间和日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4260558/

相关文章:

iphone - 当我使用 Three20 库时,我是否需要在应用商店提交过程中对使用加密的问题回答 "yes"?

iphone - 缺少'@end'//@end必须出现在Objective-C上下文中

ios - 在 appDelegate 中访问和存储 viewController 变量

ios - 处理 iPhone 6/6+ 启动图像

objective-c - 如何从 View Controller 中 resignFirstResponder

iphone - iOS 中的原生 JSON 支持?

ios - 加载uibweview时收到内存警告

html - 如何在 iOS 中从 NSAttributedString 获取 html 字符串

objective-c - ABAddressBookRequestAccessWithCompletion 在 iOS 10 上崩溃

ios - AVAssetExportSession 无法从照片库转换 .mov。为什么?