Hi,

Thanks for the reply.  If the consistency of the treatment of yday
with mktime means it's not a bug, then why wouldn't the inconsistency
with mktime's autonormalization feature be a bug?  And if Time.local
and Time.gmtime are to differ with the operation of mktime and gmtime,
why not differ on the side of convenience?

Thairr eess no porrpooss to theess...

Thanks again,
R


Mark J. Reed wrote:
> "Richard A. Ryan" <Richard.A.Ryan / noaa.gov> writes:
> 
> 
>>Hi,
> 
> 
>>I've tried this for ruby 1.8.1 and 1.6.8.
> 
> 
>>irb(main):001:0> Time.local(30, 15, 11, nil, nil, 2004, nil, 203, nil, nil)
>>=> Thu Jan 01 11:15:30 GMT 2004
> 
> 
>>For the 203rd day of the year, it does not seem I should be getting Jan 1.
>>Is this a bug?
> 
> 
> No, it's a feature.  That method call ultimately results in a call to the
> system library function mktime(3), which ignores that field:
> 
>         The  function  ignores the specified contents of
>         the structure members tm_wday and tm_yday  and  recomputes
>         them  from  the  other information in the broken”¾down time
>         structure. 
> 
> Unfortunately, Ruby interferes with the autonormalization feature mktime(3)
> provides: when calling mktime(3) directly, you can ask for, e.g. "January
> 203rd" and it will return the date of the 203rd day of the year.  The Ruby
> Time module won't let you do that, because it does a bounds check on the
> arguments, so you have to do something else.  One alternative is to use the
> fact that you can do math on Time objects, which when treated as numbers
> become a count of seconds (since January 1, 1970 at midnight UTC). So
> to get the date of the 203rd day of 2004, you could do this:
> 
>         irb(main):001:0> Time.local(30, 15, 11, 31, 12, 2003, nil, nil, nil, nil) + 203 * 86400
>         => Wed Jul 21 12:15:30 EDT 2004
> 
> 86400 is the number of seconds in a day, 24 x 60 x 60.  To get the 203rd day of
> 2004, I asked for the last day of 2003 (Dec 31st) plus 203 days.
> 
> Oh, and the time came out 12:15 instead of 11:15 because of the switch to 
> daylight savings time; 24 hours after 11:15 on the day of the change to
> EDT, it's 12:15.  If you don't care about the time, you can use the 3-argument form of
> Time.local, which uses the ISO order of year, month, day:
> 
>        irb(main):002:0> Time.local(2003, 12, 31) + 203 * 86400
>        => Wed Jul 21 01:00:00 EDT 2004
> 
> -Mark