2013-02-11 49 views
1

我有一個非常有趣的問題:當計算兩個日期之間的天數時,我的計算器在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.每月按照預期工作,只有三月份給我錯誤的結果。有沒有人有任何想法我失蹤?這是一個時區問題嗎?我如何解決它?這裏是我的代碼:3月份日期之間的錯誤日

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] 
+1

在美國,夏令時間爲3月11日,2012年(這是3月10日,2013年)。假設你在美國,當兩個日期跨越3月11日(或10日)時,這可能會推遲計算。 – rmaddy 2013-02-11 05:22:30

回答

0

大多數像這樣的是夏令時問題(2012年3月11日)。將日期格式化程序的時區設置爲:

[NSTimeZone timeZoneForSecondsFromGMT:0]; 

這應該解決該問題。

3

如果您使用NSCalendar,則不需要處理夏令時計算。

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

謝謝,修好了! – 2013-02-11 06:01:24

+1

@GeorgeFriday:不要接受幫助的答案,請參閱http://meta.stackexchange.com/a/5235/196432。 – 2013-02-11 06:06:45

0

要添加到別人,請不要依靠一天中的秒數86400,它不會。請務必從WWDC 2011觀看會話211執行日曆計算。

0

您可以將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); 
相關問題