class Delocalize::LocalizedDateTimeParser
def apply_regex(format)
def apply_regex(format) # maybe add other options as well format.gsub('%B', "(#{Date::MONTHNAMES.compact.join('|')})"). # long month name gsub('%b', "(#{Date::ABBR_MONTHNAMES.compact.join('|')})"). # short month name gsub('%m', "(\\d{2})"). # numeric month gsub('%A', "(#{Date::DAYNAMES.join('|')})"). # full day name gsub('%a', "(#{Date::ABBR_DAYNAMES.join('|')})"). # short day name gsub('%Y', "(\\d{4})"). # long year gsub('%y', "(\\d{2})"). # short year gsub('%e', "(\\w?\\d{1,2})"). # short day gsub('%d', "(\\d{2})"). # full day gsub('%H', "(\\d{2})"). # hour (24) gsub('%M', "(\\d{2})"). # minute gsub('%S', "(\\d{2})") # second end
def default_parse(datetime, type)
def default_parse(datetime, type) return if datetime.blank? begin today = Date.current parsed = Date._parse(datetime) return if parsed.empty? # the datetime value is invalid # set default year, month and day if not found parsed.reverse_merge!(:year => today.year, :mon => today.mon, :mday => today.mday) datetime = Time.zone.local(*parsed.values_at(:year, :mon, :mday, :hour, :min, :sec)) Date == type ? datetime.to_date : datetime rescue datetime end end
def input_formats(type)
def input_formats(type) # Date uses date formats, all others use time formats type = type == Date ? :date : :time (@input_formats ||= {})[type] ||= I18n.t(:"#{type}.formats").slice(*I18n.t(:"#{type}.input.formats")).values end
def parse(datetime, type)
def parse(datetime, type) return unless datetime return datetime if datetime.respond_to?(:strftime) # already a Date/Time object -> no need to parse it translate_month_and_day_names(datetime) input_formats(type).each do |original_format| next unless datetime =~ /^#{apply_regex(original_format)}$/ datetime = DateTime.strptime(datetime, original_format) return Date == type ? datetime.to_date : Time.zone.local(datetime.year, datetime.mon, datetime.mday, datetime.hour, datetime.min, datetime.sec) end default_parse(datetime, type) end
def translate_month_and_day_names(datetime)
def translate_month_and_day_names(datetime) translated = I18n.t([:month_names, :abbr_month_names, :day_names, :abbr_day_names], :scope => :date).flatten.compact original = (Date::MONTHNAMES + Date::ABBR_MONTHNAMES + Date::DAYNAMES + Date::ABBR_DAYNAMES).compact translated.each_with_index { |name, i| datetime.gsub!(name, original[i]) } end