NSDate计算夏季

时间:2013-11-12 13:07:26

标签: objective-c cocoa nsdate nsdatecomponents

我有一个时间戳(NSDate),我想验证是否在同一日历周,月,年,日等发生了另一个时间戳。

我尝试通过定义2个其他NSDate来做到这一点,一个作为开始日期,一个作为结束日期。 然后用这两个日期表示所需的时间跨度。

定义当天开始的示例:

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 个答案:

答案 0 :(得分:2)

获得给定日期的日/周/月/ ...时间跨度的最简单方法是 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
}