require 'date' module Roo class Excelx class Cell class DateTime < Cell::Base attr_reader :value, :formula, :format, :cell_value, :link, :coordinate def initialize(value, formula, excelx_type, style, link, base_date, coordinate) super(value, formula, excelx_type, style, link, coordinate) @type = :datetime @format = excelx_type.last @value = link? ? Roo::Link.new(link, value) : create_datetime(base_date, value) end # Public: Returns formatted value for a datetime. Format's can be an # standard excel format, or a custom format. # # Standard formats follow certain conventions. Date fields for # days, months, and years are separated with hyhens or # slashes ("-", /") (e.g. 01-JAN, 1/13/15). Time fields for # hours, minutes, and seconds are separated with a colon (e.g. # 12:45:01). # # If a custom format follows those conventions, then the custom # format will be used for the a cell's formatted value. # Otherwise, the formatted value will be in the following # format: 'YYYY-mm-dd HH:MM:SS' (e.g. "2015-07-10 20:33:15"). # # Examples # formatted_value #=> '01-JAN' # # Returns a String representation of a cell's value. def formatted_value formatter = @format.downcase.split(' ').map do |part| if (parsed_format = parse_date_or_time_format(part)) parsed_format else warn 'Unable to parse custom format. Using "YYYY-mm-dd HH:MM:SS" format.' return @value.strftime('%F %T') end end.join(' ') @value.strftime(formatter) end private def parse_date_or_time_format(part) date_regex = /(?[dmy]+[\-\/][dmy]+([\-\/][dmy]+)?)/ time_regex = /(?