2014-05-17 52 views
0

我想在我的iOS應用程序中獲取特定的日期格式。 基本上,這是一個短信歷史列表。我想顯示如下格式的日期,如果文本是比一週前收到的少:NSDateFormatter - 「昨天,下午3:30」

「今天,3:30 PM」

「昨天上午03點28」

「週一:12,1:PM」

如何使用NSDateFormatter來獲取輸出?我嘗試了幾個沒有成功的組合,主要問題在於第一部分;今天/昨天等

非常感謝!

編輯:這是我的代碼在這一刻。 (日部分不工作,我有麻煩了「dateFromTemplate」 &「timeStyle」在同一時間工作。)

NSString *dateComponents = @"eee"; 
formatter=[[NSDateFormatter alloc] init]; 
formatter.timeStyle=NSDateFormatterShortStyle; 
[formatter setDateFormat:[NSDateFormatter dateFormatFromTemplate:dateComponents options:0 locale:[NSLocale autoupdatingCurrentLocale]]]; 
formatter.doesRelativeDateFormatting=YES; 
formatter.locale=[NSLocale autoupdatingCurrentLocale]; 
+0

它,你可以找到通過互聯網,檢查此鏈接[FormatterKit]最好(https://github.com/mattt/獲取時間FormatterKit) – Pawan

+0

NSDateFormatter本身不會這樣做。但是,除非你全部用於匹配語言環境或其他類似的東西,否則只需編寫一些代碼就可以了。可能NSCalendar組件:fromDate:toDate:就是你想要的。 –

回答

1

很容易自己實現一個,如果你看一看NSDateComponents。但是,有一些漂亮的庫可以做到這一點。看到這個,它好好的https://github.com/kevinlawler/NSDate-TimeAgo。這是我爲應用程序編寫的代碼,可以將其擴展到您的需要。這是NSDate上的一個類別。

@implementation NSDate(DateAgo) 

+ (NSDate*)dateEarlierToDate:(NSDate*)date byDays:(int)days{ 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 
    NSDateComponents *components = [[NSDateComponents alloc] init]; 
    [components setDay:-days]; 
    return [calendar dateByAddingComponents:components toDate:date options:0]; 
} 


-(NSString*)timeAgoFromReference{ 
    static NSDateFormatter *formatter; 
    if(!formatter){ 
     formatter = [[NSDateFormatter alloc] init]; 
     [formatter setDateStyle:NSDateFormatterShortStyle]; 
    } 
    NSDate *now = [NSDate date]; 
    NSTimeInterval timeIntervalFromNow = [now timeIntervalSinceDate:self]; 
    if(timeIntervalFromNow/(60*60*24) > 9){ 
     return [formatter stringFromDate:self]; 
    }else{ 
     return [self timeAgoFromInterval:timeIntervalFromNow]; 
    } 

} 
-(NSString*)timeAgoFromInterval:(NSTimeInterval)interval{ 
    if(interval < 1){ 
     return @"A second ago"; 
    }else if(interval < 5){ 
     return @"5 seconds ago"; 
    }else if(interval < 10){ 
     return @"10 seconds ago"; 
    }else if(interval < 15){ 
     return @"15 seconds ago"; 
    }else if(interval < 30){ 
      return @"30 seconds ago"; 
    }else if(interval < 60){ 
     return @"1 minute ago"; 
    }else if(fabs(interval/60) < 60){ 
     return [NSString stringWithFormat:@"%d minutes ago",(int)(interval/60)]; 
    }else{ 
     int timeInHours = interval/(60*60); 
     if(timeInHours == 1){ 
      return @"1 hour ago"; 
     }else if(timeInHours < 24){ 
      return [NSString stringWithFormat:@"%d hours ago",timeInHours]; 
     }else{ 
      int timeInDay = timeInHours/24; 
      if(timeInDay == 1){ 
       return @"1 day ago"; 
      }else{ 
       return [NSString stringWithFormat:@"%d days ago", timeInDay]; 
      } 
     } 
    } 
    return @"0"; 
} 
@end 

如果你有一定的日期,你可以這樣調用它,

NSString *dateAgo = [date timeAgoFromReference]; 

但是,這是簡單,容易理解,你可以自己輕鬆地添加更多的功能到這個

+0

是的,我想自己實現它。看我的編輯我的當前代碼。 – Shinnyx

0
  1. 創建日期組件並將日期值指定爲-1,並且可以通過將日期組件添加到當前日期來查找昨天的日期 -

    NSDateComponents *NsD = [[NSDateComponents alloc] init]; 
    NsD.day = -1; 
    NSDate *yesterday = [[NSCalendar currentCalendar] dateByAddingComponents:NsD toDate:dateNow options:0]; 
    
  2. 您可以通過使用日期格式

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];   
    [formatter setDateFormat:@"hh:mm a"]; 
    NSString *dateStr = [formatter stringFromDate:[NSDate date]]; 
    
+0

你誤解了這個問題 – vikingosegundo