代码之家  ›  专栏  ›  技术社区  ›  Ed Marty

nscalendar日差错误

  •  7
  • Ed Marty  · 技术社区  · 14 年前

    我想用 [[NSCalendar currentCalendar] ordinalityOfUnit:NSDayCalendarUnit inUnit:NSEraCalendarUnit forDate:date] 在两个不同的日期看他们是否在同一天。但是,如果我的时区不同(比如说,德国的某个地方),即使日期明显相同,返回的天数也不同。如果我使用 NSYearCalendarUnit 而不是 NSEraCalendarUnit 在同一日期,返回的值相同。

    使用的唯一问题 新年日历 它是否在不同年份的同一天返回相同的值,如果两个日期属于不同年份,则确定两个日期之间的天数并不简单。

    有什么问题吗?或者如何更容易地确定两个日期是在同一天,还是确定两个日期之间的天数?

    例子:

    [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
    */
    
    2 回复  |  直到 13 年前
        1
  •  2
  •   Objective Interested Person    14 年前

    http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSCalendar_Class/Reference/NSCalendar.html : _讨论

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

    换句话说:23:34:22属于一天中的最后一个小时 二十四 0。超过零的时间等于:第二天。

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

        2
  •  6
  •   Vilém Kurz    13 年前

    提交了一个bug,但我检查了一下 Date and Time Programming Guide 再一次。如果您使用清单13中的代码(类似于您的代码),那么它的行为是错误的。但如果您使用清单14,它将按预期工作。

    编辑:从概念上讲,苹果是对的。耶稣基督(和其他人一样)出生于绝对时间,独立于时区。所以新纪元是在同一时间点开始的,不分时区。新年在每个时区都处于不同的时间点。这可以解释nsyearcalendarunit和nseracalendarunit之间的差异。问题是,他们没有在文档中明确说明这一点。