如何在IOS中将日期格式化为字符串,如“一天前”、“分钟前”?

Posted

技术标签:

【中文标题】如何在IOS中将日期格式化为字符串,如“一天前”、“分钟前”?【英文标题】:How to Format Date in to String Like as "One Days Ago","Minutes Ago" in IOS? 【发布时间】:2014-12-17 06:26:04 【问题描述】:

我创建了一个包含 JSON 解析数据的应用程序,这是我的 JSON 解析数据,其中包含一个日期,如“2014-12-02 08:00:42”,然后我将此日期转换为以下格式“2014 年 2 月 12 日”,如

NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
NSString *date=[dict valueForKey:@"post_date"];
NSDate * dateNotFormatted = [dateFormatter dateFromString:date];
[dateFormatter setDateFormat:@"d MMM YYYY"];
NSString * dateFormatted = [dateFormatter stringFromDate:dateNotFormatted];
cell.timeLabel.text=[dateFormatted uppercaseString];

它工作正常,但现在我想将此 dateFormatted 字符串转换为“一天前”、“分钟前”。我知道这个问题以前被问过很多次。

【问题讨论】:

您需要将今天的日期与 JSON 结果日期进行比较。结果你可以形成字符串 @NewStackUser 我知道,但你可以给我一些材料我的例子。 【参考方案1】:

ios 8 开始,您可以使用 NSDateComponentsFormatter 获得很多帮助(包括本地化)。注意:如果要返回“2 天 3 小时 5 分钟前”之类的字符串,可以通过更改组件格式化程序上的 allowedUnits 轻松更改字符串显示的粒度。

斯威夫特 4:

func timeAgoStringFromDate(date: Date) -> String? 
    let formatter = DateComponentsFormatter()
    formatter.unitsStyle = .full

    let now = Date()

    let calendar = NSCalendar.current
    let components1: Set<Calendar.Component> = [.year, .month, .weekOfMonth, .day, .hour, .minute, .second]
    let components = calendar.dateComponents(components1, from: date, to: now)

    if components.year ?? 0 > 0 
        formatter.allowedUnits = .year
     else if components.month ?? 0 > 0 
        formatter.allowedUnits = .month
     else if components.weekOfMonth ?? 0 > 0 
        formatter.allowedUnits = .weekOfMonth
     else if components.day ?? 0 > 0 
        formatter.allowedUnits = .day
     else if components.hour ?? 0 > 0 
        formatter.allowedUnits = [.hour]
     else if components.minute ?? 0 > 0 
        formatter.allowedUnits = .minute
     else 
        formatter.allowedUnits = .second
    

    let formatString = NSLocalizedString("%@ left", comment: "Used to say how much time has passed. e.g. '2 hours ago'")

    guard let timeString = formatter.string(for: components) else 
        return nil
    
    return String(format: formatString, timeString)


let str = timeAgoStringFromDate(date: Date().addingTimeInterval(-11000))
// Result: "3 hours, 3 minutes left"

斯威夫特:

class func timeAgoStringFromDate(date: NSDate) -> NSString? 
    let formatter = NSDateComponentsFormatter()
    formatter.unitsStyle = .Full

    let now = NSDate()

    let calendar = NSCalendar.currentCalendar()
    let components = calendar.components([NSCalendarUnit.Year, .Month, .WeekOfMonth, .Day, .Hour, .Minute, .Second],
        fromDate: date,
        toDate: now,
        options:NSCalendarOptions(rawValue: 0))

    if components.year > 0 
        formatter.allowedUnits = .Year
     else if components.month > 0 
        formatter.allowedUnits = .Month
     else if components.weekOfMonth > 0 
        formatter.allowedUnits = .WeekOfMonth
     else if components.day > 0 
        formatter.allowedUnits = .Day
     else if components.hour > 0 
        formatter.allowedUnits = .Hour
     else if components.minute > 0 
        formatter.allowedUnits = .Minute
     else 
        formatter.allowedUnits = .Second
    

    let formatString = NSLocalizedString("%@ ago", comment: "Used to say how much time has passed. e.g. '2 hours ago'")

    guard let timeString = formatter.stringFromDateComponents(components) else 
        return nil
    
    return String(format: formatString, timeString)

目标-C:

+ (NSString *)timeAgoStringFromDate:(NSDate *)date 
    NSDateComponentsFormatter *formatter = [[NSDateComponentsFormatter alloc] init];
    formatter.unitsStyle = NSDateComponentsFormatterUnitsStyleFull;

    NSDate *now = [NSDate date];

    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *components = [calendar components:(NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitWeekOfMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond)
                                               fromDate:date
                                                 toDate:now
                                                options:0];

    if (components.year > 0) 
        formatter.allowedUnits = NSCalendarUnitYear;
     else if (components.month > 0) 
        formatter.allowedUnits = NSCalendarUnitMonth;
     else if (components.weekOfMonth > 0) 
        formatter.allowedUnits = NSCalendarUnitWeekOfMonth;
     else if (components.day > 0) 
        formatter.allowedUnits = NSCalendarUnitDay;
     else if (components.hour > 0) 
        formatter.allowedUnits = NSCalendarUnitHour;
     else if (components.minute > 0) 
        formatter.allowedUnits = NSCalendarUnitMinute;
     else 
        formatter.allowedUnits = NSCalendarUnitSecond;
    

    NSString *formatString = NSLocalizedString(@"%@ ago", @"Used to say how much time has passed. e.g. '2 hours ago'");

    return [NSString stringWithFormat:formatString, [formatter stringFromDateComponents:components]];

【讨论】:

您可以通过使用maximumUnitCount 属性并将其设置为1 来简化此操作。然后您可以将allowedUnits 设置为您要查找的所有类型,然后它将仅显示您拥有的最高单位. 这太完美了,你能用你的建议更新你在 Objective C 中的答案吗? 完美!【参考方案2】:

Swift 5 上使用 RelativeDateTimeFormatter,

let formatter = RelativeDateTimeFormatter()

formatter.localizedString(from: DateComponents(day: -1)) // "1 day ago"
formatter.localizedString(from: DateComponents(hour: 2)) // "in 2 hours"
formatter.localizedString(from: DateComponents(minute: 45)) // "in 45 minutes"

设置 dateTimeStyle 获取本地化的指示语句,例如-

  formatter.dateTimeStyle = .named 
  formatter.localizedString(from: DateComponents(day: -1)) // "yesterday"

【讨论】:

仅供参考:仅适用于 iOS 13.0【参考方案3】:

@jDutton 的简化实现

swift4swift3

extension Date 
   var timestampString: String? 
      let formatter = DateComponentsFormatter()
      formatter.unitsStyle = .full
      formatter.maximumUnitCount = 1
      formatter.allowedUnits = [.year, .month, .day, .hour, .minute, .second]

      guard let timeString = formatter.string(from: self, to: Date()) else 
           return nil
      

      let formatString = NSLocalizedString("%@ ago", comment: "")
      return String(format: formatString, timeString)
   

swift2

extension NSDate 
   var timestampString: String? 
      let formatter = NSDateComponentsFormatter()
      formatter.unitsStyle = .Full
      formatter.maximumUnitCount = 1
      formatter.allowedUnits = [.Year, .Month, .Day, .Hour, .Minute, .Second]

      guard let timeString = formatter.stringFromDate(self, toDate: NSDate()) else 
         return nil
      

      let formatString = NSLocalizedString("%@ ago", comment: "")
      return String(format: formatString, timeString)
   

【讨论】:

错误:给出“4天,1小时前”。它应该只是“4天前”。 @g212gs 看起来这是你的问题openradar.me/radar?id=4939022170324992【参考方案4】:

我使用DateTools 来实现它。支持 Cocoapods 安装。

像这样工作..

NSDate *timeAgoDate = [NSDate dateWithTimeIntervalSinceNow:-4];
NSLog(@"Time Ago: %@", timeAgoDate.timeAgoSinceNow);
NSLog(@"Time Ago: %@", timeAgoDate.shortTimeAgoSinceNow);

//Output:
//Time Ago: 4 seconds ago
//Time Ago: 4s

取自 Github 页面 (https://github.com/MatthewYork/DateTools)

【讨论】:

@lkmal Ezzani 你能给我一个例子吗?这里我使用 NSDate-Time-Ago 然后我把它作为月份名称,比如“11 月 19 日下午 12:37”但我想要就像一个月前,2个月前。请给我一个例子。 @AshishGabani,最好是通过 Github(上面附有链接)自己尝试一下。您将对它的工作原理有更好的了解。此外,您已经从 NSDate * dateNotFormatted = [dateFormatter dateFromString:date]; 获得了所需的 NSDate 【参考方案5】:

此函数将返回从秒到年的 NSString。 就像您的日期是“1 秒前”或“1 分钟前”或“1 年前”等等......它会同样返回......

+(NSString*)HourCalculation:(NSString*)PostDate


    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
    [dateFormat setTimeZone:gmt];
    NSDate *ExpDate = [dateFormat dateFromString:PostDate];
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *components = [calendar components:(NSDayCalendarUnit|NSWeekCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit|NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:ExpDate toDate:[NSDate date] options:0];
    NSString *time;
    if(components.year!=0)
    
        if(components.year==1)
        
            time=[NSString stringWithFormat:@"%ld year",(long)components.year];
        
        else
        
            time=[NSString stringWithFormat:@"%ld years",(long)components.year];
        
    
    else if(components.month!=0)
    
        if(components.month==1)
        
            time=[NSString stringWithFormat:@"%ld month",(long)components.month];
        
        else
        
            time=[NSString stringWithFormat:@"%ld months",(long)components.month];
        
    
    else if(components.week!=0)
    
        if(components.week==1)
        
            time=[NSString stringWithFormat:@"%ld week",(long)components.week];
        
        else
        
            time=[NSString stringWithFormat:@"%ld weeks",(long)components.week];
        
    
    else if(components.day!=0)
    
        if(components.day==1)
        
            time=[NSString stringWithFormat:@"%ld day",(long)components.day];
        
        else
        
            time=[NSString stringWithFormat:@"%ld days",(long)components.day];
        
    
    else if(components.hour!=0)
    
        if(components.hour==1)
        
            time=[NSString stringWithFormat:@"%ld hour",(long)components.hour];
        
        else
        
            time=[NSString stringWithFormat:@"%ld hours",(long)components.hour];
        
    
    else if(components.minute!=0)
    
        if(components.minute==1)
        
            time=[NSString stringWithFormat:@"%ld min",(long)components.minute];
        
        else
        
            time=[NSString stringWithFormat:@"%ld mins",(long)components.minute];
        
    
    else if(components.second>=0)
    
        if(components.second==0)
        
            time=[NSString stringWithFormat:@"1 sec"];
        
        else
        
            time=[NSString stringWithFormat:@"%ld secs",(long)components.second];
        
    
    return [NSString stringWithFormat:@"%@ ago",time];

【讨论】:

@karthikeyan - 你的编辑在哪里,关于 components.week 已弃用? @Anand 抱歉,我现在没有那个代码。我根据我的项目进行了编辑。不在这里!!!【参考方案6】:

基于扩展的方法:

Swift 3,Xcode 版本 8.2.1:

extension String 
    func date(withFormat format: String = "yyyy-MM-dd HH:mm:ss") -> Date? 
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = format
        dateFormatter.locale = Calendar.current.locale
        return dateFormatter.date(from: self)
    

    

extension Date 
    var elapsedTime: String? 
        let componentFormatter = DateComponentsFormatter()
        componentFormatter.unitsStyle = .full
        componentFormatter.zeroFormattingBehavior = .dropAll
        componentFormatter.maximumUnitCount = 1
        componentFormatter.allowedUnits = [.year, .month, .weekOfMonth, .day, .hour, .minute]
        
        // to write "About" at the beginning but be careful if your app is 
        // available in languages other than English
        componentFormatter.includesApproximationPhrase = true
                
        return componentFormatter.string(from: self, to: Date()).flatMap  
            String(format: "%@ ago", $0) 
        
    

    
// Optional("About 5 years ago")
print("2016-11-16 16:28:17".date()?.elapsedTime)

【讨论】:

【参考方案7】:

一个选项是您可以比较当前时间和前一个时间并实现切换案例以获取您想要的字符串。

或者您可以使用以下任何库:

    FormatterKit NSDate-Time-Ago

我已经为 swift 创建了一个库,你可以从这里获取它:Past

【讨论】:

请您给我示例,了解如何使用 NSDate-TIme-Ago 库和 FormatterKit 库我在 GitHub 文档中阅读过,但我不完全理解,感谢您的称赞。 这里我使用 NSDate-Time-Ago 然后我将它作为月份名称获取就像“11 月 19 日下午 12:37”但我想要一个月前,2 个月前。请给我例子为它 @AshishGabani:检查 FormatterKit 中给出的示例应用程序,它适合您的需要 很遗憾,NSDate-Time-Ago 只支持英文。有一个不同的NSDate-Time-Ago 现在是 DateTools 的一部分。【参考方案8】:

您还可以在此处找到示例: https://github.com/tneginareb/Time-Ago-iOS

您可以修改输入变量“timeAtMiliseconds”,我的示例是日期格式为毫秒。

+(NSString *) parseDate: (long)dayago

if(dayago == 0)
    return @"";

NSString *timeLength =[NSString stringWithFormat:@"%lu",dayago];
NSUInteger length = [timeLength length];
if(length == 13)
    dayago = dayago / 1000;



NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate *createdDate = [NSDate dateWithTimeIntervalSince1970:dayago];
NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"GMT"];
[dateFormatter setTimeZone:timeZone];
NSString *formattedDateString = [dateFormatter stringFromDate:createdDate];

if([self todaysIsLess:formattedDateString])
    return @"";



NSString *timeLeft;
NSDate *currentDate =[NSDate date];
NSInteger seconds = [currentDate timeIntervalSinceDate:createdDate];




NSInteger days = (int) (floor(seconds / (3600 * 24)));
if(days) seconds -= days * 3600 * 24;

NSInteger hours = (int) (floor(seconds / 3600));
if(hours) seconds -= hours * 3600;

NSInteger minutes = (int) (floor(seconds / 60));
if(minutes) seconds -= minutes * 60;

if(days) 
    timeLeft = [NSString stringWithFormat:@"%ld Days", (long)days*-1];

else if(hours)  timeLeft = [NSString stringWithFormat: @"%ld H", (long)hours*-1];

else if(minutes)  timeLeft = [NSString stringWithFormat: @"%ld M", (long)minutes*-1];

else if(seconds)
    timeLeft = [NSString stringWithFormat: @"%lds", (long)seconds*-1];
//NSLog(@"Days: %lu <>  Hours: %lu <> Minutes: %lu  <> Seconds: %lu",days,hours,minutes,seconds);

NSString *result = [[NSString alloc]init];

if (days == 0) 
    if (hours == 0) 
        if (minutes == 0) 
            if (seconds < 0) 
                return @"0s";
             else 
                if (seconds < 59) 
                    return @"now";
                
            
         else 
            return  [NSString stringWithFormat:@"%lum",minutes];
        
     else 
        return  [NSString stringWithFormat:@"%luh",hours];
    

 else 
    if (days <= 29) 
        return  [NSString stringWithFormat: @"%lud",days];
    
    if (days > 29 && days <= 58) 
        return  @"1Mth";
    
    if (days > 58 && days <= 87) 
        return  @"2Mth";
    
    if (days > 87 && days <= 116) 
        return  @"3Mth";
    
    if (days > 116 && days <= 145) 
        return  @"4Mth";
    
    if (days > 145 && days <= 174) 
        return  @"5Mth";
    
    if (days > 174 && days <= 203) 
        return  @"6Mth";
    
    if (days > 203 && days <= 232) 
        return  @"7Mth";
    
    if (days > 232 && days <= 261) 
        return  @"8Mth";
    
    if (days > 261 && days <= 290) 
        return  @"9Mth";
    
    if (days > 290 && days <= 319) 
        return  @"10Mth";
    
    if (days > 319 && days <= 348) 
        return  @"11Mth";
    
    if (days > 348 && days <= 360) 
        return  @"12Mth";
    

    if (days > 360 && days <= 720) 
        return  @"1Yrs";
    

    if (days > 720) 

        NSDateFormatter *formatter1 = [[NSDateFormatter alloc] init];
        [formatter1 setDateFormat:@"MM/dd/yyyy"];
        NSString *fdisplay = [formatter1 stringFromDate:createdDate];
        return fdisplay;
    



return result;



-(BOOL) todaysIsLess: (NSString *)dateToCompare
NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"GMT"];
NSDateFormatter *dateFormatter1 = [[NSDateFormatter alloc] init];
[dateFormatter1 setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
[dateFormatter1 setTimeZone:timeZone];
NSDate *today = [NSDate date];
NSDate *newDate = [dateFormatter1 dateFromString:dateToCompare];
NSComparisonResult result;
result = [today compare:newDate];
if(result==NSOrderedAscending)
    return true;
return false;

使用示例:

 long createdDate = 1433183206;//1433183206 --> 01 June 2015
NSLog(@"Parse Date: %@",[self parseDate:createdDate]); 

【讨论】:

尝试了不同的输入,效果很好。谢谢【参考方案9】:
//String to store the date from json response
   NSString *firstDateString;

 //Dateformatter as per the response date
NSDateFormatter *df=[[NSDateFormatter alloc] init];

// Set the date format according to your needs
[df setTimeZone:[NSTimeZone timeZoneWithName:@"America/Toronto"]];

//[df setDateFormat:@"MM/dd/YYYY HH:mm "]  // for 24 hour format
[df setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; // 12 hour format


   firstDateString = value from json;    

 //converting the date to required format.
 NSDate *date1 = [df dateFromString:firstDateString];
  NSDate *date2 = [df dateFromString:[df stringFromDate:[NSDate date]]];  

    //Calculating the time interval
    NSTimeInterval secondsBetween = [date2 timeIntervalSinceDate:date1];

    int numberOfDays = secondsBetween / 86400;
    int timeResult = ((int)secondsBetween % 86400);
    int hour = timeResult / 3600;
    int hourResult = ((int)timeResult % 3600);
    int minute = hourResult / 60;


    if(numberOfDays > 0)
    
        if(numberOfDays == 1)
        
            Nslog("%@", [NSString stringWithFormat:@"%d %@",numberOfDays,@"day ago"]);

        
        else
        
            Nslog("%@", [NSString stringWithFormat:@"%d %@",numberOfDays,@"days ago"]);
        
    
    else if(numberOfDays == 0 && hour > 0)
    
        if(numberOfDays == 0 && hour == 1)
        
            cell.newsDateLabel.text = [NSString stringWithFormat:@"%d %@",hour,@"hour ago"];
        
        else
        
            cell.newsDateLabel.text = [NSString stringWithFormat:@"%d %@",hour,NSLocalizedString(@"news_hours_ago",nil)];
        
    
    else if(numberOfDays == 0 && hour == 0 && minute > 0)
    
        if(numberOfDays == 0 && hour == 0 && minute == 1)
        
            cell.newsDateLabel.text = [NSString stringWithFormat:@"%d %@",minute,@"minute ago"];

        
        else
        
            cell.newsDateLabel.text = [NSString stringWithFormat:@"%d %@",minute,NSLocalizedString(@"news_minutes_ago",nil)];
        

    
    else
    
        cell.newsDateLabel.text = [NSString stringWithFormat:NSLocalizedString(@"news_seconds_ago",nil)];
    

【讨论】:

你能解释一下吗? 哪一部分你看不懂@karthikeyan 我能看懂代码,加cmets会更好 让我们continue this discussion in chat。【参考方案10】:
        NSDateFormatter *dateFormat=[[NSDateFormatter alloc]init];
    [dateFormat setDateFormat:@"MM"];
    NSDate *todayDate = [NSDate date];
    NSDate *yourJSONDate;
    if ([[dateFormat stringFromDate:todayDate] integerValue]==[[dateFormat stringFromDate:yourJSONDate] integerValue]) 
        //month is same
        [dateFormat setDateFormat:@"dd"];
        if ([[dateFormat stringFromDate:todayDate] integerValue]==[[dateFormat stringFromDate:yourJSONDate] integerValue]) 
        //date is same

        
        else
            //date differ
            // now here you can check value for date

        

    
    else
        //month differ
        // now here you can check value for month
    

试试这个。一旦你得到相同或不同,你可以再次检查值并制作字符串。在 if 循环中,您可以嵌入其他答案,并且可以根据您的要求做出更具体的回答。

【讨论】:

【参考方案11】:

试试下面的代码:

+ (NSString*) getTimestampForDate:(NSDate*)sourceDate 

    // Timezone Offset compensation

    NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithName:@"America/New_York"];
    NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];

    NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
    NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];

    NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;

    NSDate* destinationDate = [[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate];

    // Timestamp calculation (based on correction)

    NSCalendar* currentCalendar = [NSCalendar currentCalendar];
    NSCalendarUnit unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit;

    NSDateComponents *differenceComponents = [currentCalendar components:unitFlags fromDate:destinationDate toDate:[NSDate date] options:0];

    NSInteger yearDifference = [differenceComponents year];
    NSInteger monthDifference = [differenceComponents month];
    NSInteger dayDifference = [differenceComponents day];
    NSInteger hourDifference = [differenceComponents hour];
    NSInteger minuteDifference = [differenceComponents minute];

    NSString* timestamp;

    if (yearDifference == 0
        && monthDifference == 0
        && dayDifference == 0
        && hourDifference == 0
        && minuteDifference <= 2) 

        //"Just Now"

        timestamp = @"Just Now";

     else if (yearDifference == 0
               && monthDifference == 0
               && dayDifference == 0
               && hourDifference == 0
               && minuteDifference < 60) 

        //"13 minutes ago"

        timestamp = [NSString stringWithFormat:@"%ld minutes ago", (long)minuteDifference];

     else if (yearDifference == 0
               && monthDifference == 0
               && dayDifference == 0
               && hourDifference == 1) 

        //"1 hour ago" EXACT

        timestamp = @"1 hour ago";

     else if (yearDifference == 0
               && monthDifference == 0
               && dayDifference == 0
               && hourDifference < 24) 

        timestamp = [NSString stringWithFormat:@"%ld hours ago", (long)hourDifference];

     else 

        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setLocale:[NSLocale currentLocale]];

        NSString* strDate, *strDate2 = @"";

        if (yearDifference == 0
            && monthDifference == 0
            && dayDifference == 1) 

            //"Yesterday at 10:23 AM", "Yesterday at 5:08 PM"

            [formatter setDateFormat:@"hh:mm a"];
            strDate = [formatter stringFromDate:destinationDate];

            timestamp = [NSString stringWithFormat:@"Yesterday at %@", strDate];

         else if (yearDifference == 0
                   && monthDifference == 0
                   && dayDifference < 7) 

            //"Tuesday at 7:13 PM"

            [formatter setDateFormat:@"EEEE"];
            strDate = [formatter stringFromDate:destinationDate];
            [formatter setDateFormat:@"hh:mm a"];
            strDate2 = [formatter stringFromDate:destinationDate];

            timestamp = [NSString stringWithFormat:@"%@ at %@", strDate, strDate2];

         else if (yearDifference == 0) 

            //"July 4 at 7:36 AM"

            [formatter setDateFormat:@"MMMM d"];
            strDate = [formatter stringFromDate:destinationDate];
            [formatter setDateFormat:@"hh:mm a"];
            strDate2 = [formatter stringFromDate:destinationDate];

            timestamp = [NSString stringWithFormat:@"%@ at %@", strDate, strDate2];

         else 

            //"March 24 2010 at 4:50 AM"

            [formatter setDateFormat:@"d MMMM yyyy"];
            strDate = [formatter stringFromDate:destinationDate];
            [formatter setDateFormat:@"hh:mm a"];
            strDate2 = [formatter stringFromDate:destinationDate];

            timestamp = [NSString stringWithFormat:@"%@ at %@", strDate, strDate2];
        
    

    return timestamp;

注意:前几行用于时区偏移校正。如果不需要,请将其注释掉,并在使用 destinationDate 的地方使用 sourceDate

【讨论】:

【参考方案12】:

Whatsapp 对话列表类型的日期格式......

-(NSString *)getChatListFormatDate

    NSString *differencDate = @"";

    NSDate *lastSeenDate = self;
    NSDate *currentDate = [NSDate date];

    NSString *timeDateStr = [self getStringFromDateFormat:@"hh:mm a"];
    NSString *dayOfWeekString = [lastSeenDate getStringFromDateFormat:@"EEEE"];

    NSCalendarUnit units = NSCalendarUnitDay | NSCalendarUnitWeekOfMonth | NSCalendarUnitWeekOfYear | NSCalendarUnitMonth | NSCalendarUnitYear;
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

    NSDateComponents *calendarLastSeen = [calendar components:units fromDate:lastSeenDate];
    NSDateComponents *calendarToday = [calendar components:units fromDate:currentDate];

    BOOL isThisYear = calendarLastSeen.year == calendarToday.year;
    BOOL isThisMonth = calendarLastSeen.month == calendarToday.month;
    BOOL isThisWeekOfMonth = calendarLastSeen.weekOfMonth == calendarToday.weekOfMonth;

    NSInteger dayDiff = calendarToday.day - calendarLastSeen.day;

    if (isThisYear && isThisMonth && dayDiff == 0) 
        differencDate = timeDateStr;//Today
    
    else if (isThisYear && isThisMonth && dayDiff == 1)
        differencDate = @"Yesterday";
    
    else if (isThisYear && isThisMonth && isThisWeekOfMonth)
        differencDate = dayOfWeekString;//apply Date
    
    else 
        NSString *strDate = [self getStringFromDateFormat:@"d/MM/yy"];
        differencDate = strDate;
    
    return differencDate;

【讨论】:

以上是关于如何在IOS中将日期格式化为字符串,如“一天前”、“分钟前”?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中将此日期字符串格式“2018-03-30T14:36:10.093”格式化为日期 [重复]

在 iOS 中将日期格式化为 dd-MMM

在 MySQL 查询中将字符串格式化为日期

如何在R中将多个日期格式格式化为一个?

如何在swift(ios)中将字符串格式的日期转换为另一种字符串格式[重复]

如何在 Go 中将时间戳格式化为 GMT?