2010-07-14 2 views
7

Я пытаюсь использовать [[NSCalendar currentCalendar] ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit forDate:date] в две разные даты, чтобы увидеть, выпадают ли они в тот же день. Однако, если мой часовой пояс отличается (скажем, где-то в Германии), хотя даты, очевидно, одинаковы, дни, которые были возвращены, различны. Если я использую NSYearCalendarUnit вместо NSEraCalendarUnit в те же даты, возвращаемые значения совпадают.NSCalendar получение разницы в день неверно

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

Любые идеи, что не так, или как легче определить, есть ли две даты в один день или определить количество дней между ними?

Пример:

[NSTimeZone setDefaultTimeZone:[NSTimeZone timeZoneWithName:@"Europe/Berlin"]]; 
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 

NSDate *date1 = [NSDate dateWithTimeIntervalSinceReferenceDate:300751200]; 
NSDate *date2 = [NSDate dateWithTimeIntervalSinceReferenceDate:300836062.388569]; 

NSLog(@"\nDate 1: %@\nDate 2: %@",date1,date2); 
/*Output: 
Date 1: 2010-07-14 00:00:00 +0200 
Date 2: 2010-07-14 23:34:22 +0200 
*/ 

int day1 = [cal ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit 
         forDate:date1]; 
int day2 = [cal ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit 
         forDate:date2]; 

NSLog(@"\nDay 1: %i\nDay 2: %i",day1,day2); 
/*Output: 
    Day 1: 733966 
    Day 2: 733967 
*/ 

day1 = [cal ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit 
        forDate:date1]; 
day2 = [cal ordinalityOfUnit:NSDayCalendarUnit inUnit:NSYearCalendarUnit 
        forDate:date2]; 

NSLog(@"\nDay 1:%i\nDay 2: %i",day1,day2); 
/*Output: 
    Day 1: 195 
    Day 2: 195 
*/ 
+0

У меня такая же проблема. Кажется, что эра начинается в фиксированное время, скажем 00:00:01 1. января года 1 GMT. NSYearCalendarUnit, похоже, начинается в 00:00:01 1. января, но в часовом поясе NSCalendar, который может не быть GMT. Это может объяснить, почему результаты года/года различаются. Я собираюсь заполнить отчет об ошибке. Это делает метод обыденности бесполезным для дневной разницы, если дни не в том же году. –

ответ

2

http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSCalendar_Class/Reference/NSCalendar.html См: «Обсуждение

ordinality в большинстве случаев не такой же, как разложившегося стоимости единицы. Обычно возвращаемые значения равны 1 и более. Например, время 00:45 находится в первый час дня, а для единиц Hour и Day соответственно результат будет равен 1. Исключением является расчет недели за месяцем, который возвращает 0 за несколько дней до первого неделя в месяце, содержащем дату. »

Иными словами: 23:34:22 относится к последнему часу дня, приближающемуся к 0. Время, прошедшее через нуль, равнозначно следующему: на следующий день.

Возможно, это можно рассматривать как ошибку: часы в течение дня, начиная с первого по двадцать третий, до нулевой? Я предлагаю: заполнить отчет об ошибке.

+0

Я не уверен, что понимаю ... Две даты, очевидно, в тот же день, но не отображаются в тот же день в эпоху, но DO появляются в тот же день в течение года. Я предполагаю, что отчет об ошибках в порядке, но есть ли какое-то временное решение? –

+1

Это зависит от того, когда начинается эта эра. Если эра начинается в полночь * GMT * в течение некоторого года, то ваши две даты не в тот же день (в эпоху). – JeremyP

6

Подано сообщение об ошибке, но затем я снова проверил Date and Time Programming Guide. Если вы используете код из листинга 13 (аналогичный вашему), он ведет себя неправильно. Но если вы используете листинг 14, он работает так, как ожидалось.

EDIT: Концептуально, Apple является правильным. Иисус Христос (как и все остальные) родился в абсолютном времени, независимо от часовых поясов. Таким образом, новая эра началась в тот же момент времени, независимо от временных зон. Новый год находится в другой момент времени в каждом часовом поясе. Это может объяснить различия между NSYearCalendarUnit и NSEraCalendarUnit. Проблема в том, что они явно не указали это в документах.

Смежные вопросы