【问题标题】:Wrong Days Between Dates for Month of March3 月份日期之间的日期错误
【发布时间】:2013-02-11 05:15:41
【问题描述】:

我有一个非常有趣的问题:在计算两个日期之间的天数时,我的计算器仅对 3 月份给出了错误的结果。我有两个文本字段,每个日期一个。如果我在 date1 中输入 3/7/12,在 date2 中输入 3/13/12,结果是 7,这是正确的(我也在计算第一天)。但是当我输入 date1 = 3/7/12 和 date2 = 3/14/12 时,结果仍然是 7,但它应该是 8。同样,如果我输入 date1 = 3/7/12 和 date2 = 3/23 /12,结果应该是 17,但它是 16。如果我将月份更改为 4 月,使得 date1 = 4/7/12 和 date2 = 4/23/12,结果为 17。每个月都按预期工作,只有三月份给了我错误的结果。有谁知道我错过了什么?这是时区问题吗?我如何解决它?这是我的代码:

NSDateFormatter *dateFormatter1 = [[NSDateFormatter alloc] init]; 
    [dateFormatter1 setDateFormat:@"MM/dd/yyyy"]; 
    NSDate *startdate1 = [dateFormatter1 dateFromString: date1.text]; 

    NSDateFormatter *dateFormatter2 = [[NSDateFormatter alloc] init];
    [dateFormatter2 setDateFormat:@"MM/dd/yyyy"];
    NSDate *enddate2 = [dateFormatter2 dateFromString: date2.text];

    int start1 = [startdate1 timeIntervalSince1970];
    int end2 = [enddate2 timeIntervalSince1970];
    double difference12 = end2-start1;
    int days12;

    days12 =(int)((double)difference12/(3600.0*24.00)+1);

    result12.text = [[NSString alloc] initWithFormat:@"%i", days12]

【问题讨论】:

  • 在美国,夏令时是 2012 年 3 月 11 日(2013 年是 3 月 10 日)。假设您在美国,当两个日期跨越 3 月 11 日(或 10 日)时,这可能会导致计算失败。

标签: objective-c


【解决方案1】:

如果您使用 NSCalendar,则无需处理夏令时计算。

int days = [[[NSCalendar currentCalendar] components:NSDayCalendarUnit
                    fromDate:startDate1
                      toDate:endDate2
                     options:0] day] + 1;

【讨论】:

【解决方案2】:

这很像夏令时问题(2012 年 3 月 11 日)。将日期格式化程序的时区设置为:

[NSTimeZone timeZoneForSecondsFromGMT:0];

这应该可以解决问题。

【讨论】:

    【解决方案3】:

    要添加到其他人,请不要一直依赖一天中的秒数是 86400,它不会。请务必观看来自WWDC 2011 的 Session 211 Performing Calendar Calculations。

    【讨论】:

      【解决方案4】:

      您可以将 NSDate 视为一个时间点。如果您想计算两个日期之间的天数,这是一个日历问题,并且有多个日历(如玛雅日历)。

      你需要的是 NSDateComponents:

      NSDate *dateToday = [NSDate date];
      NSDateComponents *dateBComponent = [[NSDateComponents alloc] init];
      [dateBComponent setDay:-10];  
      NSDate *date10DaysAgo = [[NSCalendar currentCalendar] dateByAddingComponents:dateBComponent
                                                                               toDate:dateToday
                                                                              options:0];
      
      NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
      NSDateComponents *components = [calendar components:NSDayCalendarUnit
                                                       fromDate:date10DaysAgo
                                                         toDate:dateToday
                                                        options:0];
      
      NSLog(@"Difference: %d", components.day);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-28
        • 2021-05-17
        • 2020-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多