Компоненты NSCalendar без учета времени - PullRequest
1 голос
/ 01 апреля 2011

Мы знаем, что NSDate - это UTC / GMT.Другими словами, информация о часовом поясе не связана с ним.

Существуют классы высокого уровня, такие как NSCalendar и NSTimeZone и NSDateComponents, которые принимают во внимание часовой пояс.

Исходя из этого, яиспользуя следующий код для расчета разницы в днях между двумя датами.Однако результат, который я получаю, выглядит так, как будто расчеты выполнены без учета времени.Мне интересно, если я делаю что-то не так или это по какой-то причине.

Вот код и данные:

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *comp = [calendar components:NSDayCalendarUnit fromDate:startDate toDate:stopDate options:0];
NSInteger day = [comp day];

Вывод отладки:

(gdb) po startDate
2011-04-01 03:52:13 +0000
(gdb) po stopDate
2011-04-03 15:52:13 +0000
(gdb) p (int) day
$1 = 2

Часовой пояс - стандартное тихоокеанское время, а приведенные выше даты преобразованы в PST:

startDate = 2011-03-31 8:52:13 -7
stopDate  = 2011-04-03 8:52:13 -7

Поэтому я бы ожидал, что между ними будет 4 дня, а не 2. (31-го, 1-го, 2-го и 3-го)

Причина, по которой я думаю, что часы игнорируются, заключается в том, что если добавить часыНа расчеты мы получаем 2 дня и 12 часов.

Я что-то не так делаю или это так работает?

Спасибо, Вэнс

1 Ответ

0 голосов
/ 20 ноября 2011

Не совсем. Когда вы форматируете даты в часовом поясе Тихого океана, вы получаете:

Calendars[38041:707] start: 2011-03-31 20:52:13 -0700
Calendars[38041:707] stop : 2011-04-03 08:52:13 -0700

Это немного отличается от того, что вы опубликовали. Ваш, кажется, указывает на 8 утра, а не на 8 вечера.

Кроме того, components:fromDate:toDate:options: будет считать целых единиц. Таким образом, если вы спрашиваете о количестве дней, то будет сказано, что между ними 2 целых дня, а они есть.

Возможно, лучший способ сделать то, что вы ищете, это:

NSUInteger startOrdinal = [cal ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:startDate];
NSUInteger stopOrdinal = [cal ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit forDate:stopDate];

Тогда число дней между ними будет (stopOrdinal - startOrdinal). В случае ваших дат это дает 3 (1 апреля по Гринвичу - 3 апреля по Гринвичу). Если вы действительно хотите игнорировать часть времени, вам придется выяснить, как отсечь часть дат в целевом часовом поясе. Это будет включать преобразование дат в NSDateComponent объекты, затем установку порций -hour, -minute и -second на 0. Как только вы это сделаете, вы можете изменить их обратно на NSDates, а затем продолжайте свои вычисления разности.

...