NSCalendar错误的日差异

Ed *_*rty 7 iphone cocoa-touch objective-c

我试图[[NSCalendar currentCalendar] ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit forDate:date]在两个不同的日期使用,看看它们是否在同一天落下.但是,如果我的时区不同(例如,在德国的某个地方),即使日期明显相同,返回的日期也不同.如果我使用NSYearCalendarUnit而不是NSEraCalendarUnit在相同的日期,返回的值是相同的.

使用的唯一问题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
*/
Run Code Online (Sandbox Code Playgroud)

Vil*_*urz 6

提起了一个错误,但后来又检查了日期和时间编程指南.如果您使用清单13中的代码(类似于您的代码),则表明其行为有误.但是如果你使用清单14,它会按预期工作.

编辑:从概念上讲,Apple是对的.耶稣基督(和所有其他人一样)出生在绝对的时间,独立于时区.因此,新时代始于同一时间点,无论时区如何.新时代在每个时区都处于不同的时间点.这可以解释NSYearCalendarUnit和NSEraCalendarUnit之间的差异.问题是,他们没有在文档中明确说明这一点.


小智 2

请参阅http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSCalendar_Class/Reference/NSCalendar.html:\n\xe2\x80\x9cDiscussion

\n\n

在大多数情况下,序数与单位的分解值不同。通常返回值是 1 或更大。例如,时间 00:45 位于一天中的第一个小时,对于单位“小时”和“天”,结果将为 1。例外情况是按月计算,对于第一个小时之前的天数返回 0包含该日期的月份中的周。\xe2\x80\x9d

\n\n

换句话说:23:34:22 属于一天中的最后一个小时,直到24 0。超过零的时间相当于:第二天。

\n\n

也许这可以被视为一个错误:一天中的几个小时从第一个到第二个二十到第零个?我建议:填写错误报告。

\n