我想在我的iOS应用程序中获取日期的特定格式。
基本上,这是一条短信历史记录列表。如果收到文本的时间少于一周,我想以以下格式显示日期:

“今天下午3:30”

“昨天,3:28 AM”

“星期一,下午1:12”

等等

如何使用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];

最佳答案

如果您看看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];


但是,这很简单且易于理解,您可以自己为此添加更多功能

关于ios - NSDateFormatter-“昨天,下午3:30”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23715485/

10-12 01:33