Fun with Time#to_s and locale

Anyone? Anyone? Buehler? Buehler?

Dan

This communication is the property of Qwest and may contain confidential or
privileged information. Unauthorized use of this communication is strictly
prohibited and may be unlawful. If you have received this communication
in error, please immediately notify the sender by reply e-mail and destroy
all copies of the communication and any attachments.

···

-----Original Message-----
From: Berger, Daniel [mailto:Daniel.Berger@qwest.com]
Sent: Tuesday, May 23, 2006 11:52 AM
To: ruby-talk ML
Subject: Fun with Time#to_s and locale

Hi all,

I was futzing around with Time objects and locale. Searching
the archives I didn't really see anything that let me get
Time objects back in the locale string that I want.

Did I reinvent the wheel?

require 'Win32API'

class Time
   GetDateFormat = Win32API.new('kernel32', 'GetDateFormat', 'LLPPPL',
'I')

   def to_s(lang=0)
      buffer = 0.chr * 100
      systime = [year, mon, wday, day, hour, min, sec].pack('S*')
      picture = 'dddd MMM dd yyyy' # Or change 'dddd' to 'ddd'

      if GetDateFormat.call(lang, 0, systime, picture, buffer,
buffer.size) == 0
         raise get_last_error
      end

      buffer = buffer[ /^[^\0]*/ ]

      # Splice the hours, minutes and seconds in
      buffer.split.insert(2, "#{hour}:#{min}:#{sec}
#{zone}").join(' ')
   end
end

if $0 == __FILE__
   LANG_FRENCH = 0x0c
   LANG_GERMAN = 0x07
   LANG_SPANISH = 0x0a

   p Time.now.to_s # "Tuesday May 11:48:51 MDT 23 2006"
   p Time.now.to_s(LANG_GERMAN) # "Dienstag Mai 11:48:51
MDT 23 2006"
   p Time.now.to_s(LANG_SPANISH) # "martes may 11:48:51 MDT 23 2006"
   p Time.now.to_s(LANG_FRENCH) # "mardi mai 11:48:51 MDT 23 2006"
end

I've no idea how to do this on non-Windows systems. Is there
an easier way?