Arhn - архитектура программирования

Определить, находятся ли две даты в пределах одного и того же календарного дня

Мое приложение представляет список сообщений, каждое из которых имеет дату создания.

Я не хочу просто показывать дату, а показывать разные форматы в зависимости от того, сколько времени прошло с даты создания.

например, вот как я создаю строку даты из даты:

NSDate *date = someMessage.creationDate;
NSTimeInterval timePassed = [[NSDate date] timeIntervalSinceDate:date];

if (timePassed < 60 ) { // less then one minute
  return @"now"
} else if (timePassed < 3600) { // less then one hour
  NSInteger minutes = (NSInteger) floor(timePassed / 60.0);
  return [NSString stringWithFormat:@"%d minutes ago", minutes];
}

поэтому теперь я хочу добавить следующие случаи:

else if ("timePassed < 24 hours ago and within the same calendar day")
   // do something
} else if ("timePassed > 24 hours, or within previous calendar day") {
   // do something else
}

но не уверен, как это сделать, любая помощь будет оценена



Ответы:


1

Вот простая категория на NSDate, которая добавляет полезные методы сравнения дат:

#ifndef SecondsPerDay
  #define SecondsPerDay 86400
#endif

@interface NSDate (Additions)

/**
 *  This method returns the number of days between this date and the given date.
 */
- (NSUInteger)daysBetween:(NSDate *)date;

/**
 *  This method compares the dates without time components.
 */
- (NSComparisonResult)timelessCompare:(NSDate *)date;

/*  
 * This method returns a new date with the time set to 12:00 AM midnight local time.
 */
- (NSDate *)dateWithoutTimeComponents;

@end

@implementation NSDate (Additions)

- (NSUInteger)daysBetween:(NSDate *)date
{
  NSDate *dt1 = [self dateWithoutTimeComponents];
  NSDate *dt2 = [date dateWithoutTimeComponents];
  return ABS([dt1 timeIntervalSinceDate:dt2] / SecondsPerDay);
}

- (NSComparisonResult)timelessCompare:(NSDate *)date
{
  NSDate *dt1 = [self dateWithoutTimeComponents];
  NSDate *dt2 = [date dateWithoutTimeComponents];
  return [dt1 compare:dt2];
}

- (NSDate *)dateWithoutTimeComponents
{
  NSCalendar *calendar = [NSCalendar currentCalendar];
  NSDateComponents *components = [calendar components:NSYearCalendarUnit  |
                                                      NSMonthCalendarUnit |
                                                      NSDayCalendarUnit
                                             fromDate:self];
  return [calendar dateFromComponents:components];
}

@end

Пример использования:

NSDate *currentDate = [NSDate date];
NSDate *distantPastDate = [NSDate distantPast];

NSComparisonResult *result = [currentDate timelessCompare:distantPastDate];
// result will equal NSOrderedDescending

Нужно узнать более подробную разницу во времени?

Вам нужно знать разницу между двумя датами с точностью до секунды? Используйте timeIntervalSinceDate:, который входит в стандартную комплектацию NSDate.

26.01.2014
  • +1 за очень хороший подход. Мне очень нравится этот. 26.01.2014
  • Мне просто интересно. Должны ли мы учитывать часовой пояс? 31.05.2014
  • Сам @ToyHunter NSDate не зависит от часового пояса. См. этот пост stackoverflow.com/questions/7720060/ для дискуссия о таком. 17.09.2014

  • 2

    Вы захотите посмотреть этот ответ.

    А именно:

    NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitYear fromDate:yourDate];
    
    NSUInteger year = [components year];
    NSUInteger dayOfYear = [[NSCalendar currentCalendar] ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:yourDate];
    

    Проверьте этот атрибут day для обоих NSDates, тогда вы узнаете, были ли они в один и тот же календарный день. Что касается 24 часов или меньше/больше, вы можете взять одну дату и использовать функцию timeIntervalSinceDate: и посмотреть, больше/меньше ли это 86400 (количество секунд в сутках).

    РЕДАКТИРОВАТЬ: обновлено, чтобы быть более конкретной проверкой года и дня года.

    26.01.2014
  • Это не совсем правильно. Если я не ошибаюсь, ваш метод дает день месяца. Таким образом, вы получите, например, 20 как за 20 января, так и за 20 августа. 26.01.2014
  • @Martin Мартин Спасибо, я думал очень ограниченно. Исправлено. 26.01.2014
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..