I’m not sure if this behaviour is intended, but it seems a bit weird to me. I’m using the code from How do you get DateTime.parse to return a time in your time zone?
require 'date'
estHoursOffset = +10 # Brisbane/Australia
estOffset = Rational(estHoursOffset, 24)
With some times, the DateTime that’s returned is a second earlier:
(DateTime.parse("2012-07-15 16:56:00") - (estHoursOffset/24.0)).new_offset(estOffset)
=> #<DateTime: 2012-07-15T16:55:59+10:00 (2456123.788888889,5/12,2299161)>
But with other times, it seems correct:
(DateTime.parse("2012-07-15 16:16:00") - (estHoursOffset/24.0)).new_offset(estOffset)
=> #<DateTime: 2012-07-15T16:16:00+10:00 (2456123.7611111114,5/12,2299161)>
The program I’m writing only cares about the minutes, which means I’m getting back 16:55 when I want 16:56.
So my questions are;
- Is this intentional? (If so, is it documented somewhere – I haven’t been able to find anything.)
- Is there a simple way of fixing this programmatically? Since I don’t care about seconds,I suppose I could “round up” the DateTimes returned, but it’d be good to know if this could bring up any other problems in edge cases.
This is probably because floating point numbers are imprecise – the
10/24.0you are subtracting cannot be represented exactly.If instead of subtracting that float you subtracted a rational, ie
Rational(estHoursOffset, 24)then you should be ok