0

私はObjective-Cに関する本を読んでおり、2つの日付間の経過日数を返すpalapseDaysというカテゴリをNSDateクラスに追加する演習に取り組んでいます。これが私の試みです:

-(unsigned long) elapsedDays: (NSDate *) theDate{

return ([self timeIntervalSinceDate:theDate]/3600)/24;

}

これが私のコードをテストしているプログラムのメインセクションです:

NSDate *now = [NSDate date];

NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow:-(3600*24)];


NSLog(@"%@",now);
NSLog(@"%@",yesterday);

NSLog(@"%lu",([now elapsedDays:yesterday]));

問題は、結果がゼロになり続けることです。

2012-09-22 19:28:24 +0000
2012-09-21 19:28:24 +0000
0

私はの分割が[self timeIntervalSinceDate:theDate]/3600 23.99972222222222を与えていることを理解しました。2つの日付の差は1日、つまり24時間であるため、24が得られるはずなので、これは奇妙なことです。このコードが2つの日付の間に間違った秒数を与えている理由を理解したいと思います。

除算の結果を四捨五入して修正しましたが、それでも何が悪いのかを理解したいと思います。

return round ([self timeIntervalSinceDate:theDate] / 3600) / 24;  
4

3 に答える 3

1

NSDate *now = [NSDate date];

NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow:-(3600*24)];

上記の 2 つのステートメントは、次々に実行されます。このため、24 時間で 1 秒の差が生じます。

于 2012-09-22T19:49:01.723 に答える
0

Yashavantの答えはおそらく正しいと思います。ログに記録される文字列は同じように見えるかもしれませんが、基になる日付オブジェクトはミリ秒単位でずれている可能性があります。昨日これを試してみて、問題が解決するかどうかを確認してください。

NSDate *yesterday = [NSDate dateWithTimeInterval:-86400 sinceDate:now];
于 2012-10-15T19:25:58.780 に答える
0

独自の日付計算を行わないでください。NSCalendarに任せてください。-components:fromDate:toDate:options:他の便利な方法の中で参照してください。

浮動小数点演算に固有の制限を学ぶことも役立ちます。たとえば、すべてのコンピュータ科学者が浮動小数点演算について知っておくべきことを参照してください。

于 2012-09-23T00:08:52.193 に答える