# encoding: UTF-8 # Copyright 2012 Twitter, Inc # http://www.apache.org/licenses/LICENSE-2.0 module TwitterCldr module Localized class LocalizedTimespan < LocalizedObject DEFAULT_TYPE = :default APPROXIMATE_MULTIPLIER = 0.75 TIME_IN_SECONDS = { :second => 1, :minute => 60, :hour => 3600, :day => 86400, :week => 604800, :month => 2629743.83, :year => 31556926 } def initialize(seconds, options = {}) super(seconds, options[:locale] || TwitterCldr.locale, options) end def to_s(options = {}) unit = options[:unit] || calculate_unit(base_obj.abs, options) direction = options[:direction] || (base_obj < 0 ? :ago : :until) type = options[:type] || DEFAULT_TYPE number = calculate_time(base_obj, unit) data_reader = TwitterCldr::DataReaders::TimespanDataReader.new(locale, number, { :unit => unit, :direction => direction, :type => type }) tokens = data_reader.tokenizer.tokenize(data_reader.pattern) data_reader.formatter.format(tokens, number, options) end protected def calculate_unit(seconds, options = {}) approximate = options[:approximate] approximate = false if approximate.nil? multiplier = approximate ? APPROXIMATE_MULTIPLIER : 1 if seconds < (TIME_IN_SECONDS[:minute] * multiplier) then :second elsif seconds < (TIME_IN_SECONDS[:hour] * multiplier) then :minute elsif seconds < (TIME_IN_SECONDS[:day] * multiplier) then :hour elsif seconds < (TIME_IN_SECONDS[:week] * multiplier) then :day elsif seconds < (TIME_IN_SECONDS[:month] * multiplier) then :week elsif seconds < (TIME_IN_SECONDS[:year] * multiplier) then :month else :year end end # 0 <-> 29 secs # => seconds # 30 secs <-> 44 mins, 29 secs # => minutes # 44 mins, 30 secs <-> 23 hrs, 59 mins, 29 secs # => hours # 23 hrs, 59 mins, 29 secs <-> 29 days, 23 hrs, 59 mins, 29 secs # => days # 29 days, 23 hrs, 59 mins, 29 secs <-> 1 yr minus 1 sec # => months # 1 yr <-> max time or date # => years def calculate_time(seconds, unit) (seconds.to_f / TIME_IN_SECONDS[unit].to_f).abs.round.to_i end end end end