Как я могу отформатировать дату в Objective-C, подобную библиотеке jquery.timeago?
У меня есть фид элементов, отображаемых в ячейках таблицы, часть которых является датой/меткой времени в прошлом.
В Objective-C, как я могу выполнить форматирование их так же, как jquery.timeago плагин в Интернете?
То есть, принимая дату и выдавая такие вещи, как:
- 'только сейчас
- '2 минуты назад'
- '24 дней назад '
- 'месяц назад'
Я вижу, что здесь существует класс расширения
Ответы
Ответ 1
Создать метод статического класса:
+ (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
Хорошо, я не мог спать прошлой ночью - думаю, я буду кусать. Здесь строка для строки jQuery timeAgo с исходным исходным кодом JavaScript в комментариях для справки. Использует стандартные механизмы ObjC/AppKit для пользовательских настроек и локализации. Материал, связанный с веб-интерфейсом, например, обновление существующего элемента DOM, очевидно, опускается. Также опускает механизм, в котором вы можете поместить функцию в настройки, потому что этот тип JavaScript специфичен. Без дальнейших церемоний:
Заголовочный файл:
//
// 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;
И файл реализации:
//
// 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
Я написал категорию NSDate, которая возвращает временные дельта в удобном для чтения формате (например, "4 недели, 2 дня" ). Вы можете скачать его здесь и настроить в соответствии с вашими потребностями: https://github.com/chriscdn/RHTools (ищите NSDate + timesince).
Ответ 4
Вы можете попробовать с NSDateFormater и записать его самостоятельно.
Если значение меньше одной минуты, напишите сейчас, иначе минуты, часы, дни и т.д.
Ответ 5
Я знаю, что это старо, но это то, что я сделал, что довольно просто...
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
Вы можете использовать NSDate-TimeAgo. Он может быть установлен в вашем проекте с использованием CocoaPods.
- Добавьте файлы в свой проект - вручную или через Cocoapods (pod 'NSDate + TimeAgo)
- Импортировать заголовок с помощью
#import "NSDate+TimeAgo.h"
- Используйте метод библиотеки timeAgo.
Ответ 7
fooobar.com/questions/271450/...
↑ конвертировать быстрый код.
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"
}
}
}
Ответ 8
+ (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";
}
}
Ответ 9
если у вас есть проблема с датой и временем.
вы должны подумать об этой библиотеке
https://github.com/MatthewYork/DateTools
Он всегда помогает!