如何将日期格式化为Objective-C,类似于jquery。timeago图书馆吗?

时间:2022-09-07 08:51:09

I have a feed of items displayed in table cells, part of which is a date / timestamp in the past.

我有一个显示在表单元格中的项目提要,其中一部分是过去的日期/时间戳。

In Objective-C, how can I accomplish formatting them in the same manner as the jquery.timeago plugin on the web?

在Objective-C中,如何像jquery一样完成格式化。web上的timeago插件?

That is, taking in a date and outputting things like:

也就是说,约个时间,然后输出如下内容:

  • 'just now'
  • “刚才”
  • '2 minutes ago'
  • 的2分钟前
  • '24 days ago'
  • 24天前的
  • 'a month ago'
  • 一个月前的

I see there is an NSDate extension class here with methods such as dateWithDaysBeforeNow, dateWithMinutesBeforeNow, etc, but if there is a library out there that has already done this I will use it.

我看到这里有一个NSDate扩展类,它有datewithdaysbeow, datewithminutesbe等等的方法,但是如果有一个已经完成了这个的库,我将会使用它。

EDIT: Further to this, if someone composes a method (takes a date, returns a string) that accomplishes this, either with this linked extensions library or another method, I will award them the answer.

编辑:除此之外,如果有人创建了一个方法(获取日期,返回一个字符串)来完成这个,无论是使用这个链接扩展库还是其他方法,我都会给他们答案。

EDIT 2 Bounty goes to whoever can write the fuzzy date algorithm in Objective-C.

编辑2 Bounty给任何能在Objective-C中编写模糊日期算法的人。

9 个解决方案

#1


14  

Create Static Class Method:

创建静态类方法:

+ (NSString *)stringForTimeIntervalSinceCreated:(NSDate *)dateTime serverTime:(NSDate *)serverDateTime{
    NSInteger MinInterval;
    NSInteger HourInterval;
    NSInteger DayInterval;
    NSInteger DayModules;   

    NSInteger interval = abs((NSInteger)[dateTime timeIntervalSinceDate:serverDateTime]);
    if(interval >= 86400)    
    {
        DayInterval  = interval/86400;
        DayModules = interval%86400;
        if(DayModules!=0)
        {
            if(DayModules>=3600){
                //HourInterval=DayModules/3600;
                return [NSString stringWithFormat:@"%i days", DayInterval];
            }
            else {
                if(DayModules>=60){
                    //MinInterval=DayModules/60;
                    return [NSString stringWithFormat:@"%i days", DayInterval];
                }
                else {
                    return [NSString stringWithFormat:@"%i days", DayInterval];
                }
            }
        }
        else 
        {
        return [NSString stringWithFormat:@"%i days", DayInterval];
        }

    }

    else{

        if(interval>=3600)
        {

            HourInterval= interval/3600;
            return [NSString stringWithFormat:@"%i hours", HourInterval];

        }

        else if(interval>=60){

            MinInterval = interval/60;

            return [NSString stringWithFormat:@"%i minutes", MinInterval];
        }
        else{
            return [NSString stringWithFormat:@"%i Sec", interval];
        }

    }

}

#2


7  

OK, I couldn't sleep last night -- guess I'll bite. Here's a line-for-line port of jQuery's timeAgo, with the original JavaScript source in comments for reference. Uses standard ObjC/AppKit mechanisms for user defaults and localization. Web-related stuff, like updating an existing DOM element is obviously omitted. Also omits the mechanism where you can put a function in the settings, because that's sort of JavaScript specific. Without further ado:

好吧,我昨晚睡不着——我想我会咬你的。这里是jQuery的timeAgo的换行端口,在注释中有原始的JavaScript源代码供参考。使用标准ObjC/AppKit机制进行用户默认和本地化。与web相关的内容,比如更新现有的DOM元素,显然被省略了。还可以省略在设置中放置函数的机制,因为这是JavaScript特有的。闲话少说:

Header file:

头文件:

//
//  NSDate+JQTimeAgoAdditions.h
//  JQTimeAgo
//

#import <Foundation/Foundation.h>

@interface NSDate (JQTimeAgoAdditions)

- (NSString*)timeAgo;

@end

extern NSString* const kJQTimeAgoAllowFutureKey;
extern NSString* const kJQTimeAgoStringsPrefixAgoKey;
extern NSString* const kJQTimeAgoStringsPrefixFromNowKey;
extern NSString* const kJQTimeAgoStringsSuffixAgoKey;
extern NSString* const kJQTimeAgoStringsSuffixFromNowKey;
extern NSString* const kJQTimeAgoStringsSecondsKey;
extern NSString* const kJQTimeAgoStringsMinuteKey;
extern NSString* const kJQTimeAgoStringsMinutesKey;
extern NSString* const kJQTimeAgoStringsHourKey;
extern NSString* const kJQTimeAgoStringsHoursKey;
extern NSString* const kJQTimeAgoStringsDayKey;
extern NSString* const kJQTimeAgoStringsDaysKey;
extern NSString* const kJQTimeAgoStringsMonthKey;
extern NSString* const kJQTimeAgoStringsMonthsKey;
extern NSString* const kJQTimeAgoStringsYearKey;
extern NSString* const kJQTimeAgoStringsYearsKey;
extern NSString* const kJQTimeAgoStringsNumbersKey;

And the implementation file:

和实现文件:

//
//  NSDate+JQTimeAgoAdditions.m
//  JQTimeAgo
//

#import "NSDate+JQTimeAgoAdditions.h"

@implementation NSDate (JQTimeAgoAdditions)

- (NSString*)timeAgo
{
    NSTimeInterval distanceMillis = -1000.0 * [self timeIntervalSinceNow];
//        inWords: function(distanceMillis) {
//            var $l = this.settings.strings;
    NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
//            var prefix = $l.prefixAgo;
    NSString* prefix = [defs stringForKey: kJQTimeAgoStringsPrefixAgoKey];
//            var suffix = $l.suffixAgo;
    NSString* suffix = [defs stringForKey: kJQTimeAgoStringsSuffixAgoKey];
//            if (this.settings.allowFuture) {
    if ([defs boolForKey: kJQTimeAgoAllowFutureKey])
    {
//                if (distanceMillis < 0) {
        if (distanceMillis < 0.0) 
        {
//                    prefix = $l.prefixFromNow;
            prefix = [defs stringForKey: kJQTimeAgoStringsPrefixFromNowKey];
//                    suffix = $l.suffixFromNow;
            suffix = [defs stringForKey: kJQTimeAgoStringsSuffixFromNowKey];
//                }
        }
//                distanceMillis = Math.abs(distanceMillis);
        distanceMillis = fabs(distanceMillis);            
//            }
    }
//            
//            var seconds = distanceMillis / 1000;
    const double seconds = distanceMillis / 1000.0;
//            var minutes = seconds / 60;
    const double minutes = seconds / 60.0;
//            var hours = minutes / 60;
    const double hours = minutes / 60.0;
//            var days = hours / 24;
    const double days = hours / 24.0;
//            var years = days / 365;
    const double years = days / 365.0;
//            
//            function substitute(stringOrFunction, number) { ... }
    // Use stringWithFormat, etc.
//            
//            var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) ||
    NSString* words = nil;
    if (seconds < 45)
        words = [[defs stringForKey: kJQTimeAgoStringsSecondsKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)round(seconds)]];
//            seconds < 90 && substitute($l.minute, 1) ||
    else if (seconds < 90)
        words = [[defs stringForKey: kJQTimeAgoStringsMinuteKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)1]];

//            minutes < 45 && substitute($l.minutes, Math.round(minutes)) ||
    else if (minutes < 45)
        words = [[defs stringForKey: kJQTimeAgoStringsMinutesKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)round(minutes)]];

//            minutes < 90 && substitute($l.hour, 1) ||
    else if (minutes < 90)
        words = [[defs stringForKey: kJQTimeAgoStringsHourKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)1]];

//            hours < 24 && substitute($l.hours, Math.round(hours)) ||
    else if (hours < 24)
        words = [[defs stringForKey: kJQTimeAgoStringsHoursKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)round(hours)]];

//            hours < 48 && substitute($l.day, 1) ||
    else if (hours < 48)
        words = [[defs stringForKey: kJQTimeAgoStringsDayKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)1]];
//            days < 30 && substitute($l.days, Math.floor(days)) ||
    else if (days < 30)
        words = [[defs stringForKey: kJQTimeAgoStringsDaysKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)floor(days)]];

//            days < 60 && substitute($l.month, 1) ||
    else if (days < 60)
        words = [[defs stringForKey: kJQTimeAgoStringsMonthKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)1]];

//            days < 365 && substitute($l.months, Math.floor(days / 30)) ||
    else if (days < 365)
        words = [[defs stringForKey: kJQTimeAgoStringsMonthsKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)floor(days/30.0)]];

//            years < 2 && substitute($l.year, 1) ||
    else if (years < 2)
        words = [[defs stringForKey: kJQTimeAgoStringsYearKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)1]];
//            substitute($l.years, Math.floor(years));
    else
        words = [[defs stringForKey: kJQTimeAgoStringsYearsKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)floor(years)]];
//            
//            return $.trim([prefix, words, suffix].join(" "));
    NSString* retVal = [[NSString stringWithFormat: @"%@ %@ %@", 
                         (prefix ? prefix : @""),
                         (words ? words : @""),
                         (suffix ? suffix : @"")] stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];
    return retVal;
//        },
}

// Load settings
+ (void)load
{    
    // Frameworks are guaranteed to be loaded by now so we can use NSDictionary, etc...
    // See here for details: http://www.mikeash.com/pyblog/friday-qa-2009-05-22-objective-c-class-loading-and-initialization.html
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        @autoreleasepool 
        {
            NSDictionary* settings = [NSDictionary dictionaryWithObjectsAndKeys:
                                      [NSNumber numberWithBool: NO], kJQTimeAgoAllowFutureKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsPrefixAgoKey, nil, [NSBundle mainBundle], @" ", @"kJQTimeAgoStringsPrefixAgoKey"), kJQTimeAgoStringsPrefixAgoKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsPrefixFromNowKey, nil, [NSBundle mainBundle], @" ", @"kJQTimeAgoStringsPrefixFromNowKey"), kJQTimeAgoStringsPrefixFromNowKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsSuffixAgoKey, nil, [NSBundle mainBundle], @"ago", @"kJQTimeAgoStringsSuffixAgoKey"), kJQTimeAgoStringsSuffixAgoKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsSuffixFromNowKey, nil, [NSBundle mainBundle], @"from now", @"kJQTimeAgoStringsSuffixFromNowKey"), kJQTimeAgoStringsSuffixFromNowKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsSecondsKey, nil, [NSBundle mainBundle], @"less than a minute", @"kJQTimeAgoStringsSecondsKey"), kJQTimeAgoStringsSecondsKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsMinuteKey, nil, [NSBundle mainBundle], @"about a minute", @"kJQTimeAgoStringsMinuteKey"), kJQTimeAgoStringsMinuteKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsMinutesKey, nil, [NSBundle mainBundle], @"%d minutes", @"kJQTimeAgoStringsMinutesKey"), kJQTimeAgoStringsMinutesKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsHourKey, nil, [NSBundle mainBundle], @"about an hour", @"kJQTimeAgoStringsHourKey"), kJQTimeAgoStringsHourKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsHoursKey, nil, [NSBundle mainBundle], @"about %d hours", @"kJQTimeAgoStringsHoursKey"), kJQTimeAgoStringsHoursKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsDayKey, nil, [NSBundle mainBundle], @"about a day", @"kJQTimeAgoStringsDayKey"), kJQTimeAgoStringsDayKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsDaysKey, nil, [NSBundle mainBundle], @"%d days", @"kJQTimeAgoStringsDaysKey"), kJQTimeAgoStringsDaysKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsMonthKey, nil, [NSBundle mainBundle], @"about a month", @"kJQTimeAgoStringsMonthKey"), kJQTimeAgoStringsMonthKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsMonthsKey, nil, [NSBundle mainBundle], @"%d months", @"kJQTimeAgoStringsMonthsKey"), kJQTimeAgoStringsMonthsKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsYearKey, nil, [NSBundle mainBundle], @"about a year", @"kJQTimeAgoStringsYearKey"), kJQTimeAgoStringsYearKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsYearsKey, nil, [NSBundle mainBundle], @"%d years", @"kJQTimeAgoStringsYearsKey"), kJQTimeAgoStringsYearsKey,
                                      nil];


            [[NSUserDefaults standardUserDefaults] registerDefaults: settings];
        }
    });
}

@end

NSString* const kJQTimeAgoAllowFutureKey = @"kJQTimeAgoAllowFutureKey";
NSString* const kJQTimeAgoStringsPrefixAgoKey = @"kJQTimeAgoStringsPrefixAgoKey";
NSString* const kJQTimeAgoStringsPrefixFromNowKey = @"kJQTimeAgoStringsPrefixFromNowKey";
NSString* const kJQTimeAgoStringsSuffixAgoKey = @"kJQTimeAgoStringsSuffixAgoKey";
NSString* const kJQTimeAgoStringsSuffixFromNowKey = @"kJQTimeAgoStringsSuffixFromNowKey";
NSString* const kJQTimeAgoStringsSecondsKey = @"kJQTimeAgoStringsSecondsKey";
NSString* const kJQTimeAgoStringsMinuteKey = @"kJQTimeAgoStringsMinuteKey";
NSString* const kJQTimeAgoStringsMinutesKey = @"kJQTimeAgoStringsMinutesKey";
NSString* const kJQTimeAgoStringsHourKey = @"kJQTimeAgoStringsHourKey";
NSString* const kJQTimeAgoStringsHoursKey = @"kJQTimeAgoStringsHoursKey";
NSString* const kJQTimeAgoStringsDayKey = @"kJQTimeAgoStringsDayKey";
NSString* const kJQTimeAgoStringsDaysKey = @"kJQTimeAgoStringsDaysKey";
NSString* const kJQTimeAgoStringsMonthKey = @"kJQTimeAgoStringsMonthKey";
NSString* const kJQTimeAgoStringsMonthsKey = @"kJQTimeAgoStringsMonthsKey";
NSString* const kJQTimeAgoStringsYearKey = @"kJQTimeAgoStringsYearKey";
NSString* const kJQTimeAgoStringsYearsKey = @"kJQTimeAgoStringsYearsKey";
NSString* const kJQTimeAgoStringsNumbersKey = @"kJQTimeAgoStringsNumbersKey";

#3


4  

I wrote an NSDate category that returns time deltas in a human readable format (e.g., "4 weeks, 2 days"). You can download it here and tweak it to your needs: https://github.com/chriscdn/RHTools (look for NSDate+timesince).

我编写了一个NSDate类别,它以人类可读的格式返回时间增量(例如,“4周,2天”)。您可以在这里下载它并根据需要调整它:https://github.com/chriscdn/RHTools(查找NSDate+timesince)。

#4


2  

You can try with NSDateFormater and write it your self.

您可以尝试使用NSDateFormater并自己编写它。

If value is under one minute then write just now, otherwise minutes, hours, days, etc.

如果价值低于一分钟,那么现在就写,否则就写分钟、小时、天等等。

#5


2  

I know this is old but this is what I did which is fairly simple...

我知道这是旧的,但这是我做的,非常简单……

NSDate *placeDate = [object createdAt];
NSTimeInterval timeSince = [placeDate timeIntervalSinceNow];
NSLog(@"%f", timeSince);

if (timeSince > -60) {
cell.date.text = [NSString stringWithFormat:@"%f seconds ago", -timeSince];
}
else if (timeSince <= -60 && timeSince > -3600){
    cell.date.text = [NSString stringWithFormat:@"%.0f minutes ago", -timeSince/60];
}
else if (timeSince <= -3600 && timeSince > -86400){
    cell.date.text = [NSString stringWithFormat:@"%.0f hours ago", -timeSince/60/60];
}
else if (timeSince <= -86400 && timeSince > -604800){
    cell.date.text = [NSString stringWithFormat:@"%.0f days ago", -timeSince/24/60/60];
}
else if (timeSince <= -604800 && timeSince > -2592000){
    cell.date.text = [NSString stringWithFormat:@"%.0f weeks ago", -timeSince/7/24/60/60];
}
else if (timeSince <= -2592000 && timeSince > -31536000){
    cell.date.text = [NSString stringWithFormat:@"%.0f months ago", -timeSince/30/24/60/60];
}
else {
    cell.date.text = [NSString stringWithFormat:@"%.1f years ago", -timeSince/365/24/60/60];
}

#6


0  

https://*.com/a/8268903/1915957

https://*.com/a/8268903/1915957

↑ convert swift code.

↑转换代码。

class func stringForTimeIntervalSinceCreated(dateTime :NSDate, serverTime serverDateTime:NSDate) -> String {
    var MinInterval  :Int = 0
    var HourInterval :Int = 0
    var DayInterval  :Int = 0
    var DayModules   :Int = 0

    let interval = abs(Int(dateTime.timeIntervalSinceDate(serverDateTime)))
    if (interval >= 86400) {
        DayInterval = interval/86400
        DayModules = interval%86400
        if (DayModules != 0) {
            if (DayModules>=3600) {
                //HourInterval=DayModules/3600;
                return String(DayInterval) + " days"
            } else {
                if (DayModules >= 60) {
                    //MinInterval=DayModules/60;
                    return String(DayInterval) + " days"
                } else {
                    return String(DayInterval) + " days"
                }
            }
        } else {
            return String(DayInterval) + " days"
        }
    } else {
        if (interval >= 3600) {
            HourInterval = interval/3600
            return String(HourInterval) + " hours"
        } else if (interval >= 60) {
            MinInterval = interval/60
            return String(MinInterval) + " minutes"
        } else {
            return String(interval) + " Sec"
        }
    }
}

#7


0  

+ (NSString *)changeTime:(NSString *)serverDateTime{
    NSInteger MinInterval;
    NSInteger HourInterval;
    NSInteger DayInterval;
    //NSInteger DayModules;
    NSTimeInterval _interval=[serverDateTime doubleValue];
    NSDate *Serverdate = [NSDate dateWithTimeIntervalSince1970:_interval];
    NSInteger interval = (long)((NSInteger)[[NSDate date] timeIntervalSinceDate:Serverdate]);
    if(interval >= 86400)
    {
        DayInterval  = interval/86400;// no. of days
        if (DayInterval > 14){
            return [NSString stringWithFormat:@"w+"];
        }
        if (DayInterval >= 7 && DayInterval <= 14){
            int diff =  (int)DayInterval / 7;
            return [NSString stringWithFormat:@"%iw",diff];
        }
        return [NSString stringWithFormat:@"%id",(int)DayInterval];
    }
    else{

        if(interval>=3600)
        {

            HourInterval= interval/3600;
            return [NSString stringWithFormat:@"%lih", (long)HourInterval];

        }
        else if(interval>=60){

            MinInterval = interval/60;

            return [NSString stringWithFormat:@"%lim", (long)MinInterval];
        }
        else{
            return [NSString stringWithFormat:@"%lis", (long)interval];
        }
        return @"now";
    }

}

#8


0  

if you have a problem with date and time. you should think to this library

如果你对日期和时间有意见的话。你应该考虑一下这个图书馆

https://github.com/MatthewYork/DateTools

https://github.com/MatthewYork/DateTools

It always help!

它总是帮助!

#9


0  

You can use NSDate-TimeAgo. It can be installed in your project using CocoaPods.

您可以使用NSDate-TimeAgo。它可以使用CocoaPods安装在您的项目中。

  1. Add the files to your project - manually or via Cocoapods (pod 'NSDate+TimeAgo')
  2. 将文件添加到项目中——手动或通过Cocoapods (pod“NSDate+TimeAgo”)
  3. Import the header using #import "NSDate+TimeAgo.h"
  4. 使用# Import“NSDate+ timeag .h”导入头
  5. Use the library method timeAgo.
  6. 使用library方法timeAgo。

#1


14  

Create Static Class Method:

创建静态类方法:

+ (NSString *)stringForTimeIntervalSinceCreated:(NSDate *)dateTime serverTime:(NSDate *)serverDateTime{
    NSInteger MinInterval;
    NSInteger HourInterval;
    NSInteger DayInterval;
    NSInteger DayModules;   

    NSInteger interval = abs((NSInteger)[dateTime timeIntervalSinceDate:serverDateTime]);
    if(interval >= 86400)    
    {
        DayInterval  = interval/86400;
        DayModules = interval%86400;
        if(DayModules!=0)
        {
            if(DayModules>=3600){
                //HourInterval=DayModules/3600;
                return [NSString stringWithFormat:@"%i days", DayInterval];
            }
            else {
                if(DayModules>=60){
                    //MinInterval=DayModules/60;
                    return [NSString stringWithFormat:@"%i days", DayInterval];
                }
                else {
                    return [NSString stringWithFormat:@"%i days", DayInterval];
                }
            }
        }
        else 
        {
        return [NSString stringWithFormat:@"%i days", DayInterval];
        }

    }

    else{

        if(interval>=3600)
        {

            HourInterval= interval/3600;
            return [NSString stringWithFormat:@"%i hours", HourInterval];

        }

        else if(interval>=60){

            MinInterval = interval/60;

            return [NSString stringWithFormat:@"%i minutes", MinInterval];
        }
        else{
            return [NSString stringWithFormat:@"%i Sec", interval];
        }

    }

}

#2


7  

OK, I couldn't sleep last night -- guess I'll bite. Here's a line-for-line port of jQuery's timeAgo, with the original JavaScript source in comments for reference. Uses standard ObjC/AppKit mechanisms for user defaults and localization. Web-related stuff, like updating an existing DOM element is obviously omitted. Also omits the mechanism where you can put a function in the settings, because that's sort of JavaScript specific. Without further ado:

好吧,我昨晚睡不着——我想我会咬你的。这里是jQuery的timeAgo的换行端口,在注释中有原始的JavaScript源代码供参考。使用标准ObjC/AppKit机制进行用户默认和本地化。与web相关的内容,比如更新现有的DOM元素,显然被省略了。还可以省略在设置中放置函数的机制,因为这是JavaScript特有的。闲话少说:

Header file:

头文件:

//
//  NSDate+JQTimeAgoAdditions.h
//  JQTimeAgo
//

#import <Foundation/Foundation.h>

@interface NSDate (JQTimeAgoAdditions)

- (NSString*)timeAgo;

@end

extern NSString* const kJQTimeAgoAllowFutureKey;
extern NSString* const kJQTimeAgoStringsPrefixAgoKey;
extern NSString* const kJQTimeAgoStringsPrefixFromNowKey;
extern NSString* const kJQTimeAgoStringsSuffixAgoKey;
extern NSString* const kJQTimeAgoStringsSuffixFromNowKey;
extern NSString* const kJQTimeAgoStringsSecondsKey;
extern NSString* const kJQTimeAgoStringsMinuteKey;
extern NSString* const kJQTimeAgoStringsMinutesKey;
extern NSString* const kJQTimeAgoStringsHourKey;
extern NSString* const kJQTimeAgoStringsHoursKey;
extern NSString* const kJQTimeAgoStringsDayKey;
extern NSString* const kJQTimeAgoStringsDaysKey;
extern NSString* const kJQTimeAgoStringsMonthKey;
extern NSString* const kJQTimeAgoStringsMonthsKey;
extern NSString* const kJQTimeAgoStringsYearKey;
extern NSString* const kJQTimeAgoStringsYearsKey;
extern NSString* const kJQTimeAgoStringsNumbersKey;

And the implementation file:

和实现文件:

//
//  NSDate+JQTimeAgoAdditions.m
//  JQTimeAgo
//

#import "NSDate+JQTimeAgoAdditions.h"

@implementation NSDate (JQTimeAgoAdditions)

- (NSString*)timeAgo
{
    NSTimeInterval distanceMillis = -1000.0 * [self timeIntervalSinceNow];
//        inWords: function(distanceMillis) {
//            var $l = this.settings.strings;
    NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
//            var prefix = $l.prefixAgo;
    NSString* prefix = [defs stringForKey: kJQTimeAgoStringsPrefixAgoKey];
//            var suffix = $l.suffixAgo;
    NSString* suffix = [defs stringForKey: kJQTimeAgoStringsSuffixAgoKey];
//            if (this.settings.allowFuture) {
    if ([defs boolForKey: kJQTimeAgoAllowFutureKey])
    {
//                if (distanceMillis < 0) {
        if (distanceMillis < 0.0) 
        {
//                    prefix = $l.prefixFromNow;
            prefix = [defs stringForKey: kJQTimeAgoStringsPrefixFromNowKey];
//                    suffix = $l.suffixFromNow;
            suffix = [defs stringForKey: kJQTimeAgoStringsSuffixFromNowKey];
//                }
        }
//                distanceMillis = Math.abs(distanceMillis);
        distanceMillis = fabs(distanceMillis);            
//            }
    }
//            
//            var seconds = distanceMillis / 1000;
    const double seconds = distanceMillis / 1000.0;
//            var minutes = seconds / 60;
    const double minutes = seconds / 60.0;
//            var hours = minutes / 60;
    const double hours = minutes / 60.0;
//            var days = hours / 24;
    const double days = hours / 24.0;
//            var years = days / 365;
    const double years = days / 365.0;
//            
//            function substitute(stringOrFunction, number) { ... }
    // Use stringWithFormat, etc.
//            
//            var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) ||
    NSString* words = nil;
    if (seconds < 45)
        words = [[defs stringForKey: kJQTimeAgoStringsSecondsKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)round(seconds)]];
//            seconds < 90 && substitute($l.minute, 1) ||
    else if (seconds < 90)
        words = [[defs stringForKey: kJQTimeAgoStringsMinuteKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)1]];

//            minutes < 45 && substitute($l.minutes, Math.round(minutes)) ||
    else if (minutes < 45)
        words = [[defs stringForKey: kJQTimeAgoStringsMinutesKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)round(minutes)]];

//            minutes < 90 && substitute($l.hour, 1) ||
    else if (minutes < 90)
        words = [[defs stringForKey: kJQTimeAgoStringsHourKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)1]];

//            hours < 24 && substitute($l.hours, Math.round(hours)) ||
    else if (hours < 24)
        words = [[defs stringForKey: kJQTimeAgoStringsHoursKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)round(hours)]];

//            hours < 48 && substitute($l.day, 1) ||
    else if (hours < 48)
        words = [[defs stringForKey: kJQTimeAgoStringsDayKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)1]];
//            days < 30 && substitute($l.days, Math.floor(days)) ||
    else if (days < 30)
        words = [[defs stringForKey: kJQTimeAgoStringsDaysKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)floor(days)]];

//            days < 60 && substitute($l.month, 1) ||
    else if (days < 60)
        words = [[defs stringForKey: kJQTimeAgoStringsMonthKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)1]];

//            days < 365 && substitute($l.months, Math.floor(days / 30)) ||
    else if (days < 365)
        words = [[defs stringForKey: kJQTimeAgoStringsMonthsKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)floor(days/30.0)]];

//            years < 2 && substitute($l.year, 1) ||
    else if (years < 2)
        words = [[defs stringForKey: kJQTimeAgoStringsYearKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)1]];
//            substitute($l.years, Math.floor(years));
    else
        words = [[defs stringForKey: kJQTimeAgoStringsYearsKey] stringByReplacingOccurrencesOfString: @"%d" withString: [NSString stringWithFormat: @"%d", (int)floor(years)]];
//            
//            return $.trim([prefix, words, suffix].join(" "));
    NSString* retVal = [[NSString stringWithFormat: @"%@ %@ %@", 
                         (prefix ? prefix : @""),
                         (words ? words : @""),
                         (suffix ? suffix : @"")] stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];
    return retVal;
//        },
}

// Load settings
+ (void)load
{    
    // Frameworks are guaranteed to be loaded by now so we can use NSDictionary, etc...
    // See here for details: http://www.mikeash.com/pyblog/friday-qa-2009-05-22-objective-c-class-loading-and-initialization.html
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        @autoreleasepool 
        {
            NSDictionary* settings = [NSDictionary dictionaryWithObjectsAndKeys:
                                      [NSNumber numberWithBool: NO], kJQTimeAgoAllowFutureKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsPrefixAgoKey, nil, [NSBundle mainBundle], @" ", @"kJQTimeAgoStringsPrefixAgoKey"), kJQTimeAgoStringsPrefixAgoKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsPrefixFromNowKey, nil, [NSBundle mainBundle], @" ", @"kJQTimeAgoStringsPrefixFromNowKey"), kJQTimeAgoStringsPrefixFromNowKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsSuffixAgoKey, nil, [NSBundle mainBundle], @"ago", @"kJQTimeAgoStringsSuffixAgoKey"), kJQTimeAgoStringsSuffixAgoKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsSuffixFromNowKey, nil, [NSBundle mainBundle], @"from now", @"kJQTimeAgoStringsSuffixFromNowKey"), kJQTimeAgoStringsSuffixFromNowKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsSecondsKey, nil, [NSBundle mainBundle], @"less than a minute", @"kJQTimeAgoStringsSecondsKey"), kJQTimeAgoStringsSecondsKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsMinuteKey, nil, [NSBundle mainBundle], @"about a minute", @"kJQTimeAgoStringsMinuteKey"), kJQTimeAgoStringsMinuteKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsMinutesKey, nil, [NSBundle mainBundle], @"%d minutes", @"kJQTimeAgoStringsMinutesKey"), kJQTimeAgoStringsMinutesKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsHourKey, nil, [NSBundle mainBundle], @"about an hour", @"kJQTimeAgoStringsHourKey"), kJQTimeAgoStringsHourKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsHoursKey, nil, [NSBundle mainBundle], @"about %d hours", @"kJQTimeAgoStringsHoursKey"), kJQTimeAgoStringsHoursKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsDayKey, nil, [NSBundle mainBundle], @"about a day", @"kJQTimeAgoStringsDayKey"), kJQTimeAgoStringsDayKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsDaysKey, nil, [NSBundle mainBundle], @"%d days", @"kJQTimeAgoStringsDaysKey"), kJQTimeAgoStringsDaysKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsMonthKey, nil, [NSBundle mainBundle], @"about a month", @"kJQTimeAgoStringsMonthKey"), kJQTimeAgoStringsMonthKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsMonthsKey, nil, [NSBundle mainBundle], @"%d months", @"kJQTimeAgoStringsMonthsKey"), kJQTimeAgoStringsMonthsKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsYearKey, nil, [NSBundle mainBundle], @"about a year", @"kJQTimeAgoStringsYearKey"), kJQTimeAgoStringsYearKey,
                                      NSLocalizedStringWithDefaultValue(kJQTimeAgoStringsYearsKey, nil, [NSBundle mainBundle], @"%d years", @"kJQTimeAgoStringsYearsKey"), kJQTimeAgoStringsYearsKey,
                                      nil];


            [[NSUserDefaults standardUserDefaults] registerDefaults: settings];
        }
    });
}

@end

NSString* const kJQTimeAgoAllowFutureKey = @"kJQTimeAgoAllowFutureKey";
NSString* const kJQTimeAgoStringsPrefixAgoKey = @"kJQTimeAgoStringsPrefixAgoKey";
NSString* const kJQTimeAgoStringsPrefixFromNowKey = @"kJQTimeAgoStringsPrefixFromNowKey";
NSString* const kJQTimeAgoStringsSuffixAgoKey = @"kJQTimeAgoStringsSuffixAgoKey";
NSString* const kJQTimeAgoStringsSuffixFromNowKey = @"kJQTimeAgoStringsSuffixFromNowKey";
NSString* const kJQTimeAgoStringsSecondsKey = @"kJQTimeAgoStringsSecondsKey";
NSString* const kJQTimeAgoStringsMinuteKey = @"kJQTimeAgoStringsMinuteKey";
NSString* const kJQTimeAgoStringsMinutesKey = @"kJQTimeAgoStringsMinutesKey";
NSString* const kJQTimeAgoStringsHourKey = @"kJQTimeAgoStringsHourKey";
NSString* const kJQTimeAgoStringsHoursKey = @"kJQTimeAgoStringsHoursKey";
NSString* const kJQTimeAgoStringsDayKey = @"kJQTimeAgoStringsDayKey";
NSString* const kJQTimeAgoStringsDaysKey = @"kJQTimeAgoStringsDaysKey";
NSString* const kJQTimeAgoStringsMonthKey = @"kJQTimeAgoStringsMonthKey";
NSString* const kJQTimeAgoStringsMonthsKey = @"kJQTimeAgoStringsMonthsKey";
NSString* const kJQTimeAgoStringsYearKey = @"kJQTimeAgoStringsYearKey";
NSString* const kJQTimeAgoStringsYearsKey = @"kJQTimeAgoStringsYearsKey";
NSString* const kJQTimeAgoStringsNumbersKey = @"kJQTimeAgoStringsNumbersKey";

#3


4  

I wrote an NSDate category that returns time deltas in a human readable format (e.g., "4 weeks, 2 days"). You can download it here and tweak it to your needs: https://github.com/chriscdn/RHTools (look for NSDate+timesince).

我编写了一个NSDate类别,它以人类可读的格式返回时间增量(例如,“4周,2天”)。您可以在这里下载它并根据需要调整它:https://github.com/chriscdn/RHTools(查找NSDate+timesince)。

#4


2  

You can try with NSDateFormater and write it your self.

您可以尝试使用NSDateFormater并自己编写它。

If value is under one minute then write just now, otherwise minutes, hours, days, etc.

如果价值低于一分钟,那么现在就写,否则就写分钟、小时、天等等。

#5


2  

I know this is old but this is what I did which is fairly simple...

我知道这是旧的,但这是我做的,非常简单……

NSDate *placeDate = [object createdAt];
NSTimeInterval timeSince = [placeDate timeIntervalSinceNow];
NSLog(@"%f", timeSince);

if (timeSince > -60) {
cell.date.text = [NSString stringWithFormat:@"%f seconds ago", -timeSince];
}
else if (timeSince <= -60 && timeSince > -3600){
    cell.date.text = [NSString stringWithFormat:@"%.0f minutes ago", -timeSince/60];
}
else if (timeSince <= -3600 && timeSince > -86400){
    cell.date.text = [NSString stringWithFormat:@"%.0f hours ago", -timeSince/60/60];
}
else if (timeSince <= -86400 && timeSince > -604800){
    cell.date.text = [NSString stringWithFormat:@"%.0f days ago", -timeSince/24/60/60];
}
else if (timeSince <= -604800 && timeSince > -2592000){
    cell.date.text = [NSString stringWithFormat:@"%.0f weeks ago", -timeSince/7/24/60/60];
}
else if (timeSince <= -2592000 && timeSince > -31536000){
    cell.date.text = [NSString stringWithFormat:@"%.0f months ago", -timeSince/30/24/60/60];
}
else {
    cell.date.text = [NSString stringWithFormat:@"%.1f years ago", -timeSince/365/24/60/60];
}

#6


0  

https://*.com/a/8268903/1915957

https://*.com/a/8268903/1915957

↑ convert swift code.

↑转换代码。

class func stringForTimeIntervalSinceCreated(dateTime :NSDate, serverTime serverDateTime:NSDate) -> String {
    var MinInterval  :Int = 0
    var HourInterval :Int = 0
    var DayInterval  :Int = 0
    var DayModules   :Int = 0

    let interval = abs(Int(dateTime.timeIntervalSinceDate(serverDateTime)))
    if (interval >= 86400) {
        DayInterval = interval/86400
        DayModules = interval%86400
        if (DayModules != 0) {
            if (DayModules>=3600) {
                //HourInterval=DayModules/3600;
                return String(DayInterval) + " days"
            } else {
                if (DayModules >= 60) {
                    //MinInterval=DayModules/60;
                    return String(DayInterval) + " days"
                } else {
                    return String(DayInterval) + " days"
                }
            }
        } else {
            return String(DayInterval) + " days"
        }
    } else {
        if (interval >= 3600) {
            HourInterval = interval/3600
            return String(HourInterval) + " hours"
        } else if (interval >= 60) {
            MinInterval = interval/60
            return String(MinInterval) + " minutes"
        } else {
            return String(interval) + " Sec"
        }
    }
}

#7


0  

+ (NSString *)changeTime:(NSString *)serverDateTime{
    NSInteger MinInterval;
    NSInteger HourInterval;
    NSInteger DayInterval;
    //NSInteger DayModules;
    NSTimeInterval _interval=[serverDateTime doubleValue];
    NSDate *Serverdate = [NSDate dateWithTimeIntervalSince1970:_interval];
    NSInteger interval = (long)((NSInteger)[[NSDate date] timeIntervalSinceDate:Serverdate]);
    if(interval >= 86400)
    {
        DayInterval  = interval/86400;// no. of days
        if (DayInterval > 14){
            return [NSString stringWithFormat:@"w+"];
        }
        if (DayInterval >= 7 && DayInterval <= 14){
            int diff =  (int)DayInterval / 7;
            return [NSString stringWithFormat:@"%iw",diff];
        }
        return [NSString stringWithFormat:@"%id",(int)DayInterval];
    }
    else{

        if(interval>=3600)
        {

            HourInterval= interval/3600;
            return [NSString stringWithFormat:@"%lih", (long)HourInterval];

        }
        else if(interval>=60){

            MinInterval = interval/60;

            return [NSString stringWithFormat:@"%lim", (long)MinInterval];
        }
        else{
            return [NSString stringWithFormat:@"%lis", (long)interval];
        }
        return @"now";
    }

}

#8


0  

if you have a problem with date and time. you should think to this library

如果你对日期和时间有意见的话。你应该考虑一下这个图书馆

https://github.com/MatthewYork/DateTools

https://github.com/MatthewYork/DateTools

It always help!

它总是帮助!

#9


0  

You can use NSDate-TimeAgo. It can be installed in your project using CocoaPods.

您可以使用NSDate-TimeAgo。它可以使用CocoaPods安装在您的项目中。

  1. Add the files to your project - manually or via Cocoapods (pod 'NSDate+TimeAgo')
  2. 将文件添加到项目中——手动或通过Cocoapods (pod“NSDate+TimeAgo”)
  3. Import the header using #import "NSDate+TimeAgo.h"
  4. 使用# Import“NSDate+ timeag .h”导入头
  5. Use the library method timeAgo.
  6. 使用library方法timeAgo。