Date Conversions

There must be a better way of converting dates than this ugly mess ?

def convert_date format, s
  case format
  when "yymmddhhmmss"
    year = s[0,2].to_i + 2000
    month= s[2,2].to_i
    day = s[4,2].to_i
    hour = s[6,2].to_i
    minute=s[8,2].to_i
    second=s[10,2].to_i
    Time.local(year,month,day,hour,minute,second)
  when "yyyymmddhhmm"
    year = s[0,4].to_i
    month= s[4,2].to_i
    day = s[6,2].to_i
    hour = s[8,2].to_i
    minute=s[10,2].to_i
    Time.local(year,month,day,hour,minute)
  when "ddmmyyhhmm"
    day = s[0,2].to_i
    month= s[2,2].to_i
    year = s[4,2].to_i + 2000
    hour = s[6,2].to_i
    minute=s[8,2].to_i
    Time.local(year,month,day,hour,minute)
  when "yyyymmdd"
    year = s[0,4].to_i
    month= s[4,2].to_i
    day = s[6,2].to_i
    Time.local(year,month,day)
  end
end

Christer

···

--
Posted via http://www.ruby-forum.com/.

Christer Nilsson wrote:

There must be a better way of converting dates than this ugly mess ?

def convert_date format, s
case format
when "yymmddhhmmss"
  year = s[0,2].to_i + 2000
  month= s[2,2].to_i
  day = s[4,2].to_i
  hour = s[6,2].to_i
  minute=s[8,2].to_i
  second=s[10,2].to_i
  Time.local(year,month,day,hour,minute,second)
when "yyyymmddhhmm"
  year = s[0,4].to_i
  month= s[4,2].to_i
  day = s[6,2].to_i
  hour = s[8,2].to_i
  minute=s[10,2].to_i
  Time.local(year,month,day,hour,minute)
when "ddmmyyhhmm"
  day = s[0,2].to_i
  month= s[2,2].to_i
  year = s[4,2].to_i + 2000
  hour = s[6,2].to_i
  minute=s[8,2].to_i
  Time.local(year,month,day,hour,minute)
when "yyyymmdd"
  year = s[0,4].to_i
  month= s[4,2].to_i
  day = s[6,2].to_i
  Time.local(year,month,day)
end

Christer

I'm not too sure about the + 2000 part of the year calculation. It seems to be missing the pivot.

The real problem is that there are so many different date formats and none of them are *sensible*. You could write some fsm to parse the string of "ymdhms" symbols and give yourself a pat on the back for your coding skills or you could just use the code and get on with something more interesting. As a point of note there is the question of the year values, there should be an else clause to raise an error and there is no checking that the values are sensible (or even numbers), does format.size == s.size etc.

Yes to code looks ugly but I would be more concerned about the possible errors than it not being /nice/.

Sometimes ugly is the best you can get.

Hi --

···

On Wed, 11 Jan 2006, Christer Nilsson wrote:

There must be a better way of converting dates than this ugly mess ?

See Date.parse.

David

--
David A. Black
dblack@wobblini.net

"Ruby for Rails", from Manning Publications, coming April 2006!

David A. Black wrote:

See Date.parse.

Thank you, David.
Your hint collapsed my code.
Christer

def convert_date format, s
  raise "illegal date " + format + " " + s unless format.size == s.size
  s = "20" + s if format[0,6]=="yymmdd"
  s = "20" + s[4,2] + s[2,2] + s[0,2] + s[6,4] if
format[0,10]=="ddmmyyhhmm"
  DateTime.parse(s)
end

···

--
Posted via http://www.ruby-forum.com/\.