从NSDate开始显示的时间/日期与iOS中的消息和邮件应用程序一样

从NSDate开始显示的时间/日期与iOS中的消息和邮件应用程序一样,ios,cocoa-touch,nsdate,Ios,Cocoa Touch,Nsdate,我正在构建一个应用程序,要求我显示时间和日期,例如,如果对象是在24小时之前创建的,则为星期天。就像iOS中的消息和邮件应用程序将显示24小时的时间,然后将其更改为显示“周一、周二”等日期。。“。我在寻找是否可以找到任何与此完全相同的框架,或者我是否需要为此编写代码 NSString *dateString = [NSDateFormatter localizedStringFromDate:[NSDate date]

我正在构建一个应用程序,要求我显示时间和日期,例如,如果对象是在24小时之前创建的,则为星期天。就像iOS中的消息和邮件应用程序将显示24小时的时间,然后将其更改为显示“周一、周二”等日期。。“。我在寻找是否可以找到任何与此完全相同的框架,或者我是否需要为此编写代码

NSString *dateString = [NSDateFormatter localizedStringFromDate:[NSDate date]
                                                              dateStyle:NSDateFormatterShortStyle
                                                              timeStyle:NSDateFormatterFullStyle];
        NSLog(@"%@",dateString);

尝试此代码,根据您的要求进行修改。

使用NSDateFormatter并将其
doesRelativeDateFormatting
属性设置为YES。

我也需要此属性,因此我编写了以下NSDate扩展:

extension NSDate {

    func formattedRelativeString() -> String {
        let dateFormatter = NSDateFormatter()
        dateFormatter.doesRelativeDateFormatting = true

        if isToday() {
            dateFormatter.timeStyle = .ShortStyle
            dateFormatter.dateStyle = .NoStyle
        } else if isYesterday() {
            dateFormatter.timeStyle = .NoStyle
            dateFormatter.dateStyle = .MediumStyle
        } else if daysAgo() < 6 {
            return dateFormatter.weekdaySymbols[weekday()-1]
        } else {
            dateFormatter.timeStyle = .NoStyle
            dateFormatter.dateStyle = .ShortStyle
        }

        return dateFormatter.stringFromDate(self)
    }
}
扩展日期{
func formattedRelativeString()->字符串{
让dateFormatter=NSDateFormatter()
dateFormatter.doesRelativeDateFormatting=true
如果是今天(){
dateFormatter.timeStyle=.ShortStyle
dateFormatter.dateStyle=.NoStyle
}否则如果是昨天{
dateFormatter.timeStyle=.NoStyle
dateFormatter.dateStyle=.MediumStyle
}否则,如果daysAgo()<6{
return dateFormatter.weekdaySymbols[weekday()-1]
}否则{
dateFormatter.timeStyle=.NoStyle
dateFormatter.dateStyle=.ShortStyle
}
return dateFormatter.stringFromDate(self)
}
}
这需要Matthew York出色的工作能力。

Swift 3版响应:

extension NSDate {
    func formattedRelativeString() -> String 
    {
        let dateFormatter = DateFormatter()
        dateFormatter.doesRelativeDateFormatting = true

        if isToday() {
            dateFormatter.timeStyle = .short
            dateFormatter.dateStyle = .none
        } else if isYesterday() {
            dateFormatter.timeStyle = .none
            dateFormatter.dateStyle = .medium
        } else if daysAgo() < 6 {
            return dateFormatter.weekdaySymbols[weekday()-1]
        } else {
            dateFormatter.timeStyle = .none
            dateFormatter.dateStyle = .short
        }

        return dateFormatter.string(from: self as Date)
    }
}
扩展日期{
func formattedRelativeString()->字符串
{
让dateFormatter=dateFormatter()
dateFormatter.doesRelativeDateFormatting=true
如果是今天(){
dateFormatter.timeStyle=.short
dateFormatter.dateStyle=.none
}否则如果是昨天{
dateFormatter.timeStyle=.none
dateFormatter.dateStyle=.medium
}否则,如果daysAgo()<6{
return dateFormatter.weekdaySymbols[weekday()-1]
}否则{
dateFormatter.timeStyle=.none
dateFormatter.dateStyle=.short
}
return dateFormatter.string(from:self-as-Date)
}
}
为swift 4更新:

 extension NSDate {

    func formattedRelativeString() -> String 
    {
        let dateFormatter = DateFormatter()

        if isInToday || isInYesterday {
            /// today and yesterday
            /// Today, 3:57 PM
            dateFormatter.doesRelativeDateFormatting = true
            dateFormatter.timeStyle = .short
            dateFormatter.dateStyle = .short
        } else if isLessThanAweekAgo {

            /// less than a week ago
            /// Friday, 4:03 PM
            dateFormatter.dateFormat = "EEEE, h:mm a"
         } else if isInThisYear {

            // more than a week ago
            // Fri, 4 Aug, 3:55
            dateFormatter.dateFormat = "E, d MMM, h:mm a"
         } else {
            // more than a year ago
            // Aug 10, 2016, 3:56
            dateFormatter.dateFormat = "MMM d, yyyy, h:mm a"
         }

        return dateFormatter.string(from: self)
    }

}
您可以在操场上使用以下示例日期进行测试:

let now = Date()
let yesterday = Date(timeInterval: -24*60*60, since: Date())
let weekAgo = Date(timeInterval: -7*24*60*60, since: Date())
let yearAgo = Date(timeInterval: -366*24*60*60, since: Date())

以下是如何使用Swift 4和Swift 5在本地完成这一切:

extension Date {

    func formatRelativeString() -> String {
        let dateFormatter = DateFormatter()
        let calendar = Calendar(identifier: .gregorian)
        dateFormatter.doesRelativeDateFormatting = true

        if calendar.isDateInToday(self) {
            dateFormatter.timeStyle = .short
            dateFormatter.dateStyle = .none
        } else if calendar.isDateInYesterday(self){
            dateFormatter.timeStyle = .none
            dateFormatter.dateStyle = .medium
        } else if calendar.compare(Date(), to: self, toGranularity: .weekOfYear) == .orderedSame {
            let weekday = calendar.dateComponents([.weekday], from: self).weekday ?? 0
            return dateFormatter.weekdaySymbols[weekday-1]
        } else {
            dateFormatter.timeStyle = .none
            dateFormatter.dateStyle = .short
        }

        return dateFormatter.string(from: self)
    }
}

目标C形成日期和时间

使用Matthew York优秀的DateTools方法

NSDate扩展:

-(NSString *)formatDateTimeToString{
    NSDateFormatter* dateFormatter = [[NSDateFormatter alloc]init];
    [dateFormatter setLocale: [[NSLocale alloc] initWithLocaleIdentifier: [[NSLocale currentLocale] localeIdentifier]]];

    if ([[NSCalendar currentCalendar] isDateInToday:self])
    {
        [dateFormatter setTimeStyle:NSDateFormatterShortStyle];
        [dateFormatter setDateStyle:NSDateFormatterNoStyle];
    }
    else if ([[NSCalendar currentCalendar] isDateInYesterday:self])
    {
        [dateFormatter setDoesRelativeDateFormatting:YES];
        [dateFormatter setTimeStyle:NSDateFormatterNoStyle];
        [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
    }
    else if ([self daysAgo]<6)
    {
        [dateFormatter setDateFormat:@"EEEE"];
    }
    else
    {
        [dateFormatter setTimeStyle:NSDateFormatterNoStyle];
        [dateFormatter setDateStyle:NSDateFormatterShortStyle];
    }
    return  [dateFormatter stringFromDate:self];
}


-(NSInteger)daysAgo{
    return [self daysEarlierThan:[NSDate date]];
}

-(NSInteger)daysEarlierThan:(NSDate *)date{
    return ABS(MIN([self daysFrom:date], 0));
}
-(NSInteger)daysFrom:(NSDate *)date{
    return [self daysFrom:date calendar:nil];
}
-(NSInteger)daysFrom:(NSDate *)date calendar:(NSCalendar *)calendar{
    NSDate *earliest = [self earlierDate:date];
    NSDate *latest = (earliest == self) ? date : self;
    NSInteger multiplier = (earliest == self) ? -1 : 1;
    NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay fromDate:earliest toDate:latest options:0];
    return multiplier*components.day;
}
-(NSString*)formatDateTimeToString{
NSDateFormatter*dateFormatter=[[NSDateFormatter alloc]init];
[dateFormatter setLocale:[[NSLocale alloc]initWithLocaleIdentifier:[[NSLocale currentLocale]localeIdentifier]];
如果([[NSCalendar currentCalendar]isDateInToday:self])
{
[日期格式化程序setTimeStyle:NSDateFormatterShortStyle];
[dateFormatter setDateStyle:NSDateFormatterNoStyle];
}
如果([[NSCalendar currentCalendar]isDateinDateinDate:self])
{
[dateFormatter setDoesRelativeDateFormatting:是];
[dateFormatter setTimeStyle:NSDateFormatterNoStyle];
[dateFormatter setDateStyle:nsDateFormatTermeNiumStyle];
}

否则如果([self daysAgo]我不能,我只需要在TableViewCell中显示它,就像iOS中的邮件和消息应用一样,只需使用两种可能的日期格式之一(
NSDateFormatter
)取决于日期的最近程度。@rmaddy我认为你的评论更有意义。到目前为止,我只有这段代码给我时间。我如何利用这段时间来知道它是否在24小时之前,如果是的话,我如何获得周一、周二这样的日子?如果你能用一些例子来回答,那就太好了。NSDateFormatter*dateFoMatter=[[NSDateFormatter alloc]init];[dateFormatter setDateFormat:@“HH:mm:ss”];NSString*timeStampStr=[dateFormatter stringFromDate:someObj.timeStamp];你能给我举个例子吗?NSDateFormatter*formatter=[[NSDateFormatter alloc]init];formatter.doesRelativeDateFormatting=是;请参阅