ユーザーが無料トライアルのために私のサイトの 1 つにサインアップするとき、私は彼らのアカウントの有効期限を「14.days.from_now」に設定しました。次に、ホームページで、残りの日数を表示します。これは次のとおりです。
(user.trial_expires - Time.now)/86400
(1 日は 86400 秒、つまり 60 * 60 * 24 であるため)
面白いことに、これは 14 を超えているため、15 に切り上げられます。コンソールで詳細に調査すると、これは 2 日間だけ発生します (私の言いたいことがわかっている場合)。例えば
>> Time.now
=> Fri Oct 29 11:09:26 0100 2010
>> future_1_day = 1.day.from_now
=> Sat, 30 Oct 2010 11:09:27 BST 01:00
#ten past eleven tomorrow
>> (future_1_day - Time.now)/86400
=> 0.999782301526931
#less than 1, what you'd expect right?
>> future_2_day = 2.day.from_now
=> Sun, 31 Oct 2010 11:09:52 GMT 00:00
>> (future_2_day - Time.now)/86400
=> 2.04162248861183
#greater than 2 - why?
タイムゾーンに関係しているのではないかと思いました.1日後の時刻はBSTで、2日後の時刻はGMTであることに気付きました. だから、私は localtime を使ってみましたが、同じ結果が得られました!
>> future_2_day = 2.day.from_now.localtime
=> Sun Oct 31 11:11:24 0000 2010
>> (future_2_day - Time.now)/86400
=> 2.04160829127315
>> (future_2_day - Time.now.localtime)/86400
=> 2.04058651585648
その差がどれほど大きいかを考えてみると、ちょうど 1 時間遅れていることがわかりました。つまり、タイムゾーンがおかしいか、少なくとも私が理解できないタイムゾーンに関係しているようです。現在、私のタイム ゾーンは BST (英国の夏時間) で、現時点では UTC より 1 時間遅れています (この日曜日までは UTC と同じ時刻に戻ります)。
Time.now に 2 日を追加すると、余分な時間が導入されるようです: これを確認してください。Time.now から始めて、それに 2 日を加算し、Time.now を減算してから、結果から 2 日の秒数を減算すると、1 時間が残ります。
時計が日曜日の朝に戻るため、これが起こっていることに頭を叩いた瞬間に思いつきました。つまり、日曜日の朝の 11 時 20分には、今から 2 日とさらに 1 時間後になります。この投稿をすべて削除しようとしていましたが、これに気付きました:「ああ、daynum.days の代わりに (24*daynum).hours を使用してこれを修正できると思いましたが、それでも同じ結果が得られます:私は秒を使います!
>> (Time.now + (2*24).hours - Time.now) - 86400*2
=> 3599.99969500001
>> (Time.now + (2*24*3600).seconds - Time.now) - 86400*2
=> 3599.999855
だから今、私は再び混乱しています。2 日分の秒数を足して、現在の 2 日分の秒数を引いて、1 時間分の秒数にするにはどうすればよいでしょうか。余分な時間はどこに忍び込みますか?