NSDate расчеты летнее время

У меня есть отметка времени (NSDate), и я хочу проверить, произошла ли другая отметка времени в той же календарной неделе, месяце, году, дне и т. Д.

Я попытался сделать это, определив 2 другие NSDates, одну в качестве даты начала и одну в качестве даты окончания. И затем представляет желаемое время с этими двумя датами.

Пример определения начала текущего дня:

NSDate *myDate = [[NSDate alloc] init];
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:(
                                                NSEraCalendarUnit |
                                                NSMonthCalendarUnit |
                                                NSYearCalendarUnit |
                                                NSDayCalendarUnit |
                                                NSHourCalendarUnit |
                                                NSMinuteCalendarUnit |
                                                NSSecondCalendarUnit |
                                                NSTimeZoneCalendarUnit
                                                ) fromDate:myDate];

[components setHour:1];
[components setMinute:0];
[components setSecond:0];
startDate = [cal dateFromComponents:components];

Это должно установить startDate на время 00:00:00 текущей даты. Проблема в том, что это работает, только если myDate имеет текущий часовой пояс. Например, если у нас сейчас зимнее время, а NSDate - летнее время, оно устанавливает неправильное время на 1 час.

Как я могу учитывать летнее / зимнее время в этом расчете, или есть лучший способ представить конкретный временной интервал, на котором основан временной календарь на основе временной метки?

1 ответ

Решение

Самый простой способ получить временной интервал в день / неделю / месяц /... для данной даты - этоrangeOfUnit метод. Например:

NSDate *date1, *date2;

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *startOfTimespan;
NSTimeInterval lengthOfTimespan;
[calendar rangeOfUnit:NSWeekOfYearCalendarUnit
        startDate:&startOfTimespan
         interval:&lengthOfTimespan
          forDate:date1];

Сейчас startOfTimespan это начало недели, которая содержит date1, а также lengthOfTimespan длина этой недели Таким образом, вы можете проверить date2 с

NSTimeInterval diff = [date2 timeIntervalSinceDate:startOfTimespan];
if ( diff >= 0 && diff < lengthOfTimespan) {
    // date1 and date2 are in the same week
}
Другие вопросы по тегам