如何将日期格式化为字符串就像IOS中的"One Days Ago","Minutes Ago"?

16 iphone json nsdateformatter ios

我在这里创建一个包含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];
Run Code Online (Sandbox Code Playgroud)

它工作正常,但现在我想将这个dateFormatted字符串转换为"One Day Ago","Minutes Ago".我知道这个问题之前已被问过很多次了.

jDu*_*ton 21

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

斯威夫特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"
Run Code Online (Sandbox Code Playgroud)

迅速:

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)
}
Run Code Online (Sandbox Code Playgroud)

Objective-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]];
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用`maximumUnitCount`属性并将其设置为1来简化此操作.然后,您可以将`allowedUnits`设置为您要查找的所有类型,然后它将仅显示您拥有的最高单位. (5认同)

rus*_*ord 14

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"
Run Code Online (Sandbox Code Playgroud)

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

  formatter.dateTimeStyle = .named 
  formatter.localizedString(from: DateComponents(day: -1)) // "yesterday"
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考:仅适用于 iOS 13.0 (4认同)

Ikm*_*ani 8

我使用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
Run Code Online (Sandbox Code Playgroud)

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


Igo*_*uta 8

简化了@jDutton的实现

swift4,swift3

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)
   }
}
Run Code Online (Sandbox Code Playgroud)

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)
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 错误:它给出"4天,1小时前".它应该只是"4天前". (2认同)

Nik*_*wal 6

此函数将从秒到年返回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];
}
Run Code Online (Sandbox Code Playgroud)


Kas*_*aei 5

Swift 3,Xcode版本8.2.1:

func elapsedTime () -> String
{
    //just to create a date that is before the current time
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
    dateFormatter.locale = Locale.init(identifier: "en_GB")
    let before = dateFormatter.date(from: "2016-11-16 16:28:17")!

    //getting the current time
    let now = Date()

    let formatter = DateComponentsFormatter()
    formatter.unitsStyle = .full
    formatter.zeroFormattingBehavior = .dropAll
    formatter.maximumUnitCount = 1 //increase it if you want more precision
    formatter.allowedUnits = [.year, .month, .weekOfMonth, .day, .hour, .minute]
    formatter.includesApproximationPhrase = true //to write "About" at the beginning


    let formatString = NSLocalizedString("%@ ago", comment: "Used to say how much time has passed. e.g. '2 hours ago'")
    let timeString = formatter.string(from: before, to: now)
    return String(format: formatString, timeString!)
}
Run Code Online (Sandbox Code Playgroud)


Mid*_* MP 3

一种选择是您可以比较当前时间和前一个时间并实施 switch case 来获取您想要的字符串。

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

  1. 格式化工具包
  2. NSD 日期时间前

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