Как определить, произошел ли NSTimeInterval во время произвольной даты NSDate? - PullRequest
0 голосов
/ 04 июня 2009

У меня есть NSTimeInterval, и я хотел бы знать, попадает ли эта метка времени между началом и концом даты. По сути, я должен быть в состоянии сделать что-то вроде:

NSDate *today = [NSDate date];
NSTimeInterval myInterval = someInterval;

[date returnYesIfFallsThisDate:myInterval];

Есть ли прямой способ выяснить, выпадает ли мой NSTimeInterval в тот же день, что и объект NSDate?

Спасибо всем.

Ответы [ 4 ]

1 голос
/ 04 июня 2009

Это только я или ОП, кажется, думает, что NSTimeInterval - это представление интервала времени от А до В? То есть абсолютное расстояние (в секундах) от даты A до даты B.

Исходный вопрос должен быть отдан, чтобы указать, что вы должны найти его на основе контрольной даты. Примерно так:

NSDate *refDate = someReferenceDate;
NSTimeInterval interval = someInterval;
NSDate *today = [NSDate date];
BOOL isInRange = false;

isInRange = [today isInterval:interval inRangeFromReference:refDate];

Тогда этот метод будет использовать некоторые (или части всех) стратегий, которые Дамиэль, Питер и Марк упоминают выше.

1 голос
/ 04 июня 2009

Имейте в виду, что NSDate не представляет «день» в какой-либо форме, просто момент времени. Вам нужно будет немного поработать с NSDateComponents, преобразованными с использованием NSCalendar (обычно это календарь пользователя по умолчанию), чтобы выяснить начальные и конечные значения NSDate и сравнить их, чтобы сравнить ваш временной интервал с.

Я бы начал с NSDate, приходящегося на ваш день, и преобразовал его в NSDateComponents, но без часов, минут или секунд. Вот быстрый (непроверенный) пример, который поможет вам начать работу:

NSDateComponents *comps = [[NSCalendar currentCalendar] components:(NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit) fromDate:[NSDate date]];
NSDateComponents *day = [[[NSDateComponents alloc] init] autorelease];
[day setDay:1];
NSDate *start = [[NSCalendar currentCalendar] dateFromComponents:comps];
NSDate *end = [[NSCalendar currentCalendar] dateByAddingComponents:day toDate:start options:0];

Затем вы можете сравнить временной интервал, предложенный г-ном Джалкутом (или другой метод, NSDate может работать с NSTimeIntervals несколькими различными способами). Я бы определенно потратил некоторое время на просмотр NSCalendar и NSDateComponents в документах, хотя, вы можете найти лучший способ, чем тот, который я предлагаю, для того, что вам нужно сделать.

1 голос
/ 04 июня 2009

NSTimeInterval - это всего несколько секунд. Чтобы сравнить его с NSDate, вам нужно интерпретировать временной интервал относительно некоторой контрольной точки, затем создать NSDate с результатом, а затем сравнить две NSDate.

Существуют две стандартные контрольные даты: 2001-01-01 и 1970-01-01 (последняя - «время UNIX»). Если ни одна из них не является правильной контрольной датой, используйте NSCalendar, чтобы создать NSDate для правильной контрольной даты, затем создайте интересующую вас NSDate относительно этой .

Теперь для сравнения.

Если все, что вас волнует, это дата в календаре, то вы создадите NSDate, а затем используйте NSCalendar, чтобы получить NSDateComponents для даты. В частности, вы получите год, месяц и день месяца, а затем сравните их.

Нет необходимости беспокоиться о времени начала и окончания; на самом деле, если вам важна только дата в календаре, вы можете полностью игнорировать время суток.

1 голос
/ 04 июня 2009

Концептуально вам нужны две даты, которые составляют «начало» и «конец» целевой даты, о которой идет речь. Затем вы можете проверить временной интервал непосредственно по отношению к соответствующим временным интервалам этих дат.

Например, если я живу в Сан-Франциско, то я хочу, чтобы «начало» было тихоокеанским 12:00, а конец - 11: 59: 59.99999 тихоокеанским.

Как только вы выяснили, какие часовые пояса и т. Д. Вы хотите рассматривать в качестве начальной и конечной точек, вы можете просто использовать временные интервалы для проведения теста:

if ((myInterval >= [earlyMorningDate timeIntervalSinceReferenceDate]) && 
    (myInterval <= [lateEveningDate timeIntervalSinceReferenceDate]))
{
    NSLog(@"Whoo hoo - it's the right date!");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...