2010-11-23 95 views
4

與UNIX時間戳一樣1290529723,我將如何(假設GMT)得到它是否是信息開始:​​在過去七天今天從unix時間戳中獲取人類可讀的相對時間和日期?

  • (如果是的話,什麼時間)

  • (如果是的話,這一天......週一,週二 等?)不到一個星期

  • 以上(如果是這樣,如何在DD/MM/YY 格式輸出?)

我需要這個像iPhone的郵件應用程序,其中的日期/時間顯示相對於當前日期和時間,像這樣的郵件列表:

15:45 
Yesterday 
Sunday 
Saturday 
10/10/10 

回答

4

我做了這個方法,把unix時間戳變成了一個很好的可讀的相對字符串。在新的一年的前幾天可能無法正常工作,但希望你應該過於注意。

-(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; 
} 
+2

這是一個很好的答案,但事實上,沒有公共的API調用(正如在mail.app中所做的那樣)是不可信的 – lol 2012-01-23 05:01:09

0

將它轉換用一個NSDate:

+ (id)dateWithTimeIntervalSince1970:(NSTimeInterval)seconds 

然後與其他日期比較有:

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

另請參見NSDateComponents(提取時間)和NSDateFormatter(將其轉換爲字符串)。請記住,「當前」日曆不一定是你想要的; iPhone上有4種可用的格里曆日曆,但年份編號不同。做一些測試並決定你想要什麼;它可能是`[[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]`。 – 2010-11-23 22:26:38

9

獲取尊重設備區域設置的解決方案需要一點小竅門。以下方法relativeStringFromDate返回表示日期的字符串,格式爲以下:

  • 只是如果日期是今天,根據區域(例如,「3:40 PM」或'15:40' )的時間
  • '昨天'如果日期是昨天(但將被國際化爲本地語言)
  • 如果日期是2至6天前,則爲星期幾的名稱(例如,'星期一','星期二'等,再次根據語言環境的語言)
  • 只是日期部分,如果日期超過一週前,根據語言環境(例如'2012年1月20日'與'20/1/2012'歐元OPE)

    - (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; 
    } 
    

正如你和布拉德的答案中提到,您可以使用的NSDate的dateWithTimeIntervalSince1970時間戳獲得一個NSDate。

+0

謝謝你 - 偉大的實現 – Andy 2014-03-11 19:55:20

+0

謝謝Amos,這是一個非常有用的一段代碼。 – mszaro 2014-11-11 02:18:45

4

NSDateFormatter類有你所需要的。它通過doRelativeDateFormatting方法做「今天」,「明天」等。

希望能幫助別人在這裏降落,不想使用外部課堂或創建自己的課堂。

相關問題