class Wikidata::Property::Time

Constants

DATE_PRECISION
DAYS_IN_MONTH

Protected Class Methods

leap_year?(year) click to toggle source
# File lib/wikidata/property/time.rb, line 140
def self.leap_year? year
  (year % 4 == 0) && !(year % 100 == 0) || (year % 400 == 0)
end

Public Instance Methods

after() click to toggle source
# File lib/wikidata/property/time.rb, line 60
def after
  value.after
end
before() click to toggle source
# File lib/wikidata/property/time.rb, line 64
def before
  value.before
end
date() click to toggle source
# File lib/wikidata/property/time.rb, line 37
def date
  return @_date if @_date
  d = Hash[[:year, :month, :day, :hour, :min, :sec].zip(
    value.time.scan(/(-?\d+)-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})/).first.map(&:to_i)
  )]
  [:month, :day].each do |k|
    d[k] = (d[k] == 0 ? 1 : d[k])
  end
  @_date ||= DateTime.new *d.values
end
precision() click to toggle source
# File lib/wikidata/property/time.rb, line 52
def precision
  DATE_PRECISION[value.precision.to_i][:value]
end
precision_key() click to toggle source
# File lib/wikidata/property/time.rb, line 56
def precision_key
  DATE_PRECISION[value.precision.to_i][:key]
end
range() click to toggle source
# File lib/wikidata/property/time.rb, line 68
def range
  return @_range if @_range

  if before.to_i == 0 && after.to_i == 0 && precision_key
    send(:"#{precision_key}_range")
  else
    generic_range
  end
end
timestamp() click to toggle source
# File lib/wikidata/property/time.rb, line 48
def timestamp
  date.to_time.utc.to_i
end

Protected Instance Methods

century_range() click to toggle source
# File lib/wikidata/property/time.rb, line 89
def century_range
  century = date.year / 100
  if date.year > 0
    from = DateTime.new((century - 1) * 100 + 1, 1, 1, 0, 0, 0)
    to = DateTime.new(century * 100, 12, 31, 23, 59, 59)
  else
    from = DateTime.new(century * 100, 1, 1, 0, 0, 0)
    to = DateTime.new((century + 1) * 100 - 1, 12, 31, 23, 59, 59)
  end
  @_range ||= (from..to)
end
day_range() click to toggle source
# File lib/wikidata/property/time.rb, line 130
def day_range
  from = DateTime.new(date.year, date.month, date.day, 0, 0, 0)
  to = DateTime.new(date.year, date.month, date.day, 23, 59, 59)
  @_range ||= (from..to)
end
decade_range() click to toggle source
# File lib/wikidata/property/time.rb, line 107
def decade_range
  decade = date.year.round(-1)
  if decade > 0
    from = DateTime.new(decade, 1, 1, 0, 0, 0)
    to = DateTime.new(decade + 9, 12, 31, 23, 59, 59)
  else
    from = DateTime.new(decade - 9, 1, 1, 0, 0, 0)
    to = DateTime.new(decade, 12, 31, 23, 59, 59)
  end
  @_range ||= (from..to)
end
generic_range() click to toggle source
# File lib/wikidata/property/time.rb, line 80
def generic_range
  from = before > 0 ?
     timestamp - (before.to_i * precision) : timestamp
  to = after > 0 ?
    timestamp + (after.to_i * precision) : timestamp

  @_range ||= (to_datetime ::Time.at(from).utc)..(to_datetime ::Time::at(to).utc)
end
month_range() click to toggle source
# File lib/wikidata/property/time.rb, line 119
def month_range
  if date.month == 2 && self.class.leap_year?(date.year)
    last_day = 29
  else
    last_day = DAYS_IN_MONTH[date.month]
  end
  from = DateTime.new(date.year, date.month, 1, 0, 0, 0)
  to = DateTime.new(date.year, date.month, last_day, 23, 59, 59)
  @_range ||= (from..to)
end
to_datetime(t) click to toggle source
# File lib/wikidata/property/time.rb, line 136
def to_datetime(t)
  DateTime.new t.year, t.month, t.day, t.hour, t.min, t.sec
end
year_range() click to toggle source
# File lib/wikidata/property/time.rb, line 101
def year_range
  from = DateTime.new(date.year, 1, 1, 0, 0, 0)
  to = DateTime.new(date.year, 12, 31, 23, 59, 59)
  @_range ||= (from..to)
end