class Time def format(string="yyyy-m-d h:n z") delimiters = string.scan /\W+/ formatters = string.scan /[a-z0-9_]+/i format_units = { ## Date keys "d" => "d", "day" => "d", "day_zero" => "d", "dd" => "-d", "Day" => "-d", "day_unpadded" => "-d", "ddd" => "_d", "DAY" => "_d", "day_blank" => "_d", "dddd" => "j", "day_of_the_year" => "j", "m" => "m", "month" => "m", "month_zero" => "m", "mm" => "-m", "Month" => "-m", "month_unpadded" => "-m", "mmm" => "_m", "MONTH" => "_m", "month_blank" => "_m", "mmmm" => "B", "month_name" => "B", "mmmmm" => "b", "month_name_abbr" => "b", "w" => "u", "weekday" => "u", "ww" => "w", "weekday_offset" => "w", "www" => "A", "weekday_name" => "A", "wwww" => "a", "weekday_name_abbr" => "a", "wwwww" => "W", "week" => "W", "wwwwww" => "U", "week_offset" => "U", "yy" => "y", "yr" => "y", "yyyy" => "Y", "year" => "Y", ## Time keys "h" => "H", "hour" => "H", "hour_zero" => "H", "hh" => "k", "HOUR" => "k", "hour_blank" => "k", "hhh" => "I", "hour_imperical" => "I", "hour_imperical_zero" => "I", "hhhh" => "l", "HOUR_IMPERICAL" => "l", "hour_imperical_blank" => "l", "ampm" => "P", "meridian" => "P", "AMPM" => "p", "MERIDIAN" => "p", "n" => "M", "minute" => "M", "s" => "S", "second" => "S", "z" => "z", "time_zone" => "z", "zz" => ":z", "time_zone_offset" => ":z", "zzz" => "::z", "time_zone_offset_full" => "::z", "zzzz" => "Z", "time_zone_name" => "Z" } strftime( if string.empty? || string.nil? "%Y-%m-%d %H:%M %z" else formatters.map do |f| "%#{format_units[f]}#{delimiters.shift || ''}" end.join end ) end def to_format(key=:datetime_iso_tzn) format_units = { ## Date keys month: "%m", month_zero: "%m", month_unpadded: "%-m", month_blank: "%_m", month_name: "%B", month_name_abbr: "%b", weekday: "%d", weekday_zero: "%d", weekday_unpadded: "%-d", weekday_blank: "%_d", weekday_name: "%A", weekday_name_abbr: "%a", yr: "%y", year: "%Y", ## Time keys hour: "%H", hour_zero: "%H", hour_blank: "%k", hour_imperical: "%I", hour_imperical_zero: "%I", hour_imperical_blank: "%l", ampm: "%P", meridian: "%P", minute: "%M", second: "%S", time_zone: "%z", time_zone_offset: "%:z", time_zone_offset_full: "%::z", time_zone_name: "%Z", ## Datetime keys date: "%B %-d, %Y", date_abbr: "%b %-d, %Y", date_iso: "%Y-%m-%d", datetime: "%B %-d, %Y %H:%M", datetime_abbr: "%b %-d, %Y %H:%M", datetime_iso: "%Y-%m-%d %H:%M", datetime_imperical: "%B %-d, %Y %I:%M %P", datetime_imperical_abbr: "%b %-d, %Y %I:%M %P", datetime_imperical_iso: "%Y-%m-%d %I:%M %P", datetime_tzn: "%B %-d, %Y %H:%M %Z", datetime_abbr_tzn: "%b %-d, %Y %H:%M %Z", datetime_iso_tzn: "%Y-%m-%d %H:%M %z", datetime_imperical_tzn: "%B %-d, %Y %I:%M %P %Z", datetime_imperical_abbr_tzn: "%b %-d, %Y %I:%M %P %Z", datetime_imperical_iso_tzn: "%Y-%m-%d %I:%M %P %z", day: "%B %-d", day_abbr: "%b %-d", day_iso: "%m-%d", daytime: "%B %-d %H:%M", daytime_abbr: "%b %-d %H:%M", daytime_iso: "%m-%d %H:%M", daytime_imperical: "%B %-d %I:%M %P", daytime_imperical_abbr: "%b %-d %I:%M %P", daytime_imperical_iso: "%m-%d %I:%M %P", time: "%H:%M", time_zero: "%H:%M", time_blank: "%k:%M", time_tz: "%H:%M %z", time_tzn: "%H:%M %Z", time_imperical: "%I:%M %P", time_imperical_zero: "%I:%M %P", time_imperical_blank: "%l:%M %P", time_imperical_tz: "%I:%M %P %z", time_imperical_tzn: "%I:%M %P %Z" } strftime(format_units[key]) end end