1

私は非常に興味深い問題を抱えています。2つの日付の間の日数を計算するとき、私の計算機は3月だけに対して間違った結果を返します。日付ごとに1つずつ、合計2つのテキストフィールドがあります。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になります。date1=4/7/12およびdate2= 4/23/12になるように月を4月に変更すると、結果は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]
4

4 に答える 4

3

NSCalendar を使用する場合、夏時間の計算を処理する必要はありません。

int days = [[[NSCalendar currentCalendar] components:NSDayCalendarUnit
                    fromDate:startDate1
                      toDate:endDate2
                     options:0] day] + 1;
于 2013-02-11T05:40:05.957 に答える
0

これに最も似ているのは、夏時間の問題です (2012 年 3 月 11 日)。日付フォーマッタのタイムゾーンを次のように設定します。

[NSTimeZone timeZoneForSecondsFromGMT:0];

これで問題が解決するはずです。

于 2013-02-11T05:24:41.237 に答える
0

他の人に追加するには、1 日の秒数が常に 86400 であることに依存しないでください。WWDC 2011のセッション 211 Performing Calendar Calculations を必ずご覧ください。

于 2013-02-11T05:42:51.677 に答える
0

NSDate はある時点と考えることができます。2 つの日付間の日数を計算する場合、これはカレンダーの問題であり、複数のカレンダーがあります (マヤのカレンダーなど)。

必要なのは 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);
于 2013-02-11T09:48:28.383 に答える