获取特定时区中两个NSDate日期之间的天数

Vig*_*gor 8 datetime objective-c nstimezone

我在这里找到了计算两个日期之间天差的代码.
我写了一个方法:

-(NSInteger)daysWithinEraFromDate:(NSDate *) startDate toDate:(NSDate *) endDate
{
    NSCalendar *gregorian = [[NSCalendar alloc]
                             initWithCalendarIdentifier:NSGregorianCalendar];
    NSInteger startDay=[gregorian ordinalityOfUnit:NSDayCalendarUnit
                                            inUnit: NSEraCalendarUnit forDate:startDate];
    NSInteger endDay=[gregorian ordinalityOfUnit:NSDayCalendarUnit
                                          inUnit: NSEraCalendarUnit forDate:endDate];
    return endDay-startDay;
}
Run Code Online (Sandbox Code Playgroud)

这种方法有一个问题:它不能考虑时区的事情.即使我添加这样一行:

[gregorian setTimeZone:[NSTimeZone localTimeZone]];
Run Code Online (Sandbox Code Playgroud)

我的测试代码是这样的:

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSString *strDate = @"2012-09-03 23:00:00";
    NSDate *dateStart = [dateFormat dateFromString:strDate];
    strDate = @"2012-09-04 01:00:00";
    NSDate *dateEnd = [dateFormat dateFromString:strDate];
    NSLog(@"Days difference between %@ and %@  is:  %d days",[dateFormat stringFromDate:dateStart],[dateFormat stringFromDate:dateEnd],[self daysWithinEraFromDate:dateStart toDate:dateEnd]);
Run Code Online (Sandbox Code Playgroud)

结果是:

2012-09-03 23:00:00和2012-09-04 01:00:00之间的天差为:0天

我想通过这两个日期之间的中午数量获得1天的结果.我的时区是GMT +8.但是这个计算是基于GMT的,所以我得到了错误的天数.反正有没有解决这个问题?谢谢.


Scott Lemmon的方法可以解决我的问题.我像这样重写我的代码:

-(NSInteger)daysWithinEraFromDate:(NSDate *) startDate toDate:(NSDate *) endDate
{
    NSCalendar *gregorian = [[NSCalendar alloc]
                             initWithCalendarIdentifier:NSGregorianCalendar];
    [gregorian setTimeZone:[NSTimeZone localTimeZone]];
    NSDate *newDate1 = [startDate dateByAddingTimeInterval:[[NSTimeZone localTimeZone] secondsFromGMT]];
    NSDate *newDate2 = [endDate dateByAddingTimeInterval:[[NSTimeZone localTimeZone] secondsFromGMT]];

    NSInteger startDay=[gregorian ordinalityOfUnit:NSDayCalendarUnit
                                            inUnit: NSEraCalendarUnit forDate:newDate1];
    NSInteger endDay=[gregorian ordinalityOfUnit:NSDayCalendarUnit
                                          inUnit: NSEraCalendarUnit forDate:newDate2];
    return endDay-startDay;
}
Run Code Online (Sandbox Code Playgroud)

Sco*_*mon 5

如果时区偏移不起作用,那么如何手动添加或减去它呢?

在你的情况下NSDate *newDate = [oldDate dateByAddingTimeInterval:(-8 * 60 * 60)];减去你的+8小时.

或者如果你想自动找到GMT偏移,那么它就是这样 NSDate *newDate = [oldDate dateByAddingTimeInterval:(-[[NSTimeZone localTimeZone] secondsFromGMT])

另一个想法:一个更简单的解决方案就是完全忽视时间信息.只需将它设置为两个日期的相同任意数字,只要日期来自同一时区,您将始终获得正确的午夜数,无论GMT偏移如何.