# File lib/validates_timeliness/formats.rb, line 185
      def parse(string, type, options={})
        return string unless string.is_a?(String)
        options.reverse_merge!(:strict => true)

        sets = if options[:format]
          options[:strict] = true
          [ send("#{type}_expressions").assoc(options[:format]) ]
        else
          expression_set(type, string)
        end

        matches = nil
        processor = sets.each do |format, regexp, proc|
          full = /\A#{regexp}\Z/ if options[:strict]
          full ||= case type
          when :date     then /\A#{regexp}/
          when :time     then /#{regexp}\Z/
          when :datetime then /\A#{regexp}\Z/
          end
          break(proc) if matches = full.match(string.strip)
        end
        last = options[:include_offset] ? 8 : 7
        if matches
          values = processor.call(*matches[1..last])
          values[0..2] = dummy_date_for_time_type if type == :time
          return values
        end
      rescue
        nil
      end