Нечеткий алгоритм Даты в Objective C

Функциональное программирование НЕ является более интуитивным или легким для изучения, чем императивное программирование.

В функциональном программировании есть много хорошего, но я часто слышу, как функциональные программисты говорят, что функциональное программирование легче понять, чем императивное программирование для людей, не имеющих опыта программирования. Из того, что я видел, все наоборот, людям трудно решить тривиальные проблемы, потому что они не понимают, как управлять и повторно использовать свои временные результаты, когда вы попадаете в мир без государства.

11
задан Community 23 May 2017 в 12:09
поделиться

3 ответа

Даты представлены в Какао с использованием класса NSDate . В NSDate реализован удобный метод для получения разницы в секундах между двумя экземплярами даты, timeIntervalSinceDate: . Это вызывается экземпляром NSDate , принимая в качестве аргумента другой объект NSDate . Он возвращает NSTimeInterval (который является typedef для двойного числа), который представляет количество секунд между двумя датами.

Учитывая это, было бы довольно просто адаптировать код, который у вас есть приведено выше в контексте Objective-C / Cocoa. Поскольку дельта, вычисленная с помощью NSDate , дается в секундах, с учетом двух дат, вы можете легко адаптировать приведенный выше код:

//Constants
#define SECOND 1
#define MINUTE (60 * SECOND)
#define HOUR (60 * MINUTE)
#define DAY (24 * HOUR)
#define MONTH (30 * DAY)

- (NSString*)timeIntervalWithStartDate:(NSDate*)d1 withEndDate:(NSDate*)d2
{
    //Calculate the delta in seconds between the two dates
    NSTimeInterval delta = [d2 timeIntervalSinceDate:d1];

    if (delta < 1 * MINUTE)
    {
        return delta == 1 ? @"one second ago" : [NSString stringWithFormat:@"%d seconds ago", (int)delta];
    }
    if (delta < 2 * MINUTE)
    {
        return @"a minute ago";
    }
    if (delta < 45 * MINUTE)
    {
        int minutes = floor((double)delta/MINUTE);
        return [NSString stringWithFormat:@"%d minutes ago", minutes];
    }
    if (delta < 90 * MINUTE)
    {
        return @"an hour ago";
    }
    if (delta < 24 * HOUR)
    {
        int hours = floor((double)delta/HOUR);
        return [NSString stringWithFormat:@"%d hours ago", hours];
    }
    if (delta < 48 * HOUR)
    {
        return @"yesterday";
    }
    if (delta < 30 * DAY)
    {
        int days = floor((double)delta/DAY);
        return [NSString stringWithFormat:@"%d days ago", days];
    }
    if (delta < 12 * MONTH)
    {
        int months = floor((double)delta/MONTH);
        return months <= 1 ? @"one month ago" : [NSString stringWithFormat:@"%d months ago", months];
    }
    else
    {
        int years = floor((double)delta/MONTH/12.0);
        return years <= 1 ? @"one year ago" : [NSString stringWithFormat:@"%d years ago", years];
    }
}

Затем это будет вызвано,

23
ответ дан 3 December 2019 в 04:14
поделиться

Вы можете получить дельту между двумя объектами NSDate , используя метод timeIntervalSinceDate: . Это даст вам дельту в секундах.

Отсюда вы можете вычислить минуты / часы / дни / месяцы / годы, разделив на соответствующее количество.

1
ответ дан 3 December 2019 в 04:14
поделиться

Вы можете обратиться к этому руководству разработчика от Apple:

http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/DatesAndTimes/Articles/dtCalendricalCalculations.html#//apple_ref/doc/ uid / TP40007836-SW1

0
ответ дан 3 December 2019 в 04:14
поделиться