文字列の日付/時刻を数値の時刻値に変換しています。私の場合、何かが他のものよりも新しい/古いかどうかを判断するためにのみ使用しているため、この小さな小数の問題は実際の問題ではありません。秒単位の精度である必要はありません。しかし、それでも頭を悩ませているので、その理由を知りたい..
私の日付は、@"2010-09-08T17:33:53+0000" の文字列形式になっています。そこで、時間値を返すこの小さなメソッドを書きました。28 日または 31 日で 1 か月が何秒になるかについて誰かが飛びつく前に、私は気にしません。私の計算では、すべての月が 31 日で、年が 31*12 日であると想定しても問題ありません。これは、ある時点が別の時点よりも遅いかどうかを知るためだけに、2 つの時点の差を必要としないためです。
-(float) uniqueTimeFromCreatedTime: (NSString *)created_time {
float time;
if ([created_time length]>19) {
time = ([[created_time substringWithRange:NSMakeRange(2, 2)]floatValue]-10) * 535680; // max for 12 months is 535680.. uh oh y2100 bug!
time=time + [[created_time substringWithRange:NSMakeRange(5, 2)]floatValue] * 44640; // to make it easy and since it doesn't matter we assume 31 days
time=time + [[created_time substringWithRange:NSMakeRange(8, 2)]floatValue] * 1440;
time=time + [[created_time substringWithRange:NSMakeRange(11, 2)]floatValue] * 60;
time=time + [[created_time substringWithRange:NSMakeRange(14, 2)]floatValue];
time = time + [[created_time substringWithRange:NSMakeRange(17, 2)]floatValue] * .01;
return time;
}
else {
//NSLog(@"error - time string not long enough");
return 0.0;
}
}
上記の文字列が渡されると、結果は 414333.53 になるはずですが、代わりに 414333.531250 が返されます。
各 time= の間に NSLog を投げて、どこでオフになるかを追跡すると、次の結果が得られます。
time 0.000000
time 401760.000000
time 413280.000000
time 414300.000000
time 414333.000000
floatvalue 53.000000
time 414333.531250
Created Time: 2010-09-08T17:33:53+0000 414333.531250
そのため、最後の floatValue は 53.0000 を返しましたが、これに .01 を掛けると .53125 になります。intValue も試してみましたが、同じことができました。