Task

Given the date string "March 7 2009 7:30pm EST", 

output the time 12 hours later in any human-readable format.

As extra credit, display the resulting time in a time zone different from your own.




$ include "seed7_05.s7i";
  include "time.s7i";
  include "duration.s7i";
 
const func time: parseDate (in string: dateStri) is func
  result
    var time: aTime is time.value;
  local
    const array string: monthNames is [] ("January", "February", "March", "April",
        "May", "June", "July", "August", "September", "October", "November", "December");
    var array string: dateParts is 0 times "";
    var integer: month is 0;
    var string: timeStri is "";
  begin
    dateParts := split(dateStri, ' ');
    aTime.year := integer parse (dateParts[3]);
    aTime.month := 1;
    while monthNames[aTime.month] <> dateParts[1] do
      incr(aTime.month);
    end while;
    aTime.day := integer parse (dateParts[2]);
    timeStri := dateParts[4];
    if endsWith(timeStri, "am") then
      aTime.hour := integer parse (timeStri[.. pred(pos(timeStri, ':'))]);
    elsif endsWith(timeStri, "pm") then
      aTime.hour := integer parse (timeStri[.. pred(pos(timeStri, ':'))]) + 12;
    else
      raise RANGE_ERROR;
    end if;
    aTime.minute := integer parse (timeStri[succ(pos(timeStri, ':')) .. length(timeStri) - 2]);
    if dateParts[5] <> "UTC" then
      aTime.timeZone := 60 * integer parse (dateParts[5][4 ..]);
    end if;
  end func;
 
const proc: main is func
  local
    var time: aTime is time.value;
  begin
    aTime := parseDate("March 7 2009 7:30pm UTC-05");
    writeln("Given:         " <& aTime);
    aTime +:= 1 . DAYS;
    writeln("A day later:   " <& aTime);
    aTime := toUTC(aTime);
    writeln("In UTC:        " <& aTime);
  end func;