class BahaiDate::BahaiDate

Constants

AYYAM_I_HA

Attributes

day[R]
gregorian_date[R]
month[R]
weekday[R]
year[R]

Public Class Methods

new(params) click to toggle source
# File lib/bahai_date/bahai_date.rb, line 7
def initialize(params)
  if params[:date]
    @gregorian_date = params[:date]
    year, month, day = from_gregorian
    @year = Year.new(year)
    @month = Month.new(month)
    @day = Day.new(day)
  elsif params[:year] && params[:month] && params[:day]
    @year = Year.new(params[:year])
    @month = Month.new(params[:month])
    @day = Day.new(params[:day])
    validate_ayyam_i_ha
    @gregorian_date = to_gregorian
  else
    fail ArgumentError, 'Invalid arguments. Use a hash with :date or with :year, :month, and :day.'
  end
  @weekday = Weekday.new(weekday_from_gregorian)
end

Public Instance Methods

+(val) click to toggle source
# File lib/bahai_date/bahai_date.rb, line 42
def +(val)
  self.class.new(date: @gregorian_date + val)
end
-(val) click to toggle source
# File lib/bahai_date/bahai_date.rb, line 46
def -(val)
  self.class.new(date: @gregorian_date - val)
end
long_format() click to toggle source
# File lib/bahai_date/bahai_date.rb, line 34
def long_format
  "#{@weekday} #{@day.number} #{@month} #{@year.bahai_era} B.E."
end
occasions() click to toggle source
# File lib/bahai_date/bahai_date.rb, line 26
def occasions
  OccasionFactory.new(@year.bahai_era, @month.number, @day.number).occasions
end
short_format() click to toggle source
# File lib/bahai_date/bahai_date.rb, line 38
def short_format
  "#{@day.number} #{@month} #{@year.bahai_era}"
end
to_s() click to toggle source
# File lib/bahai_date/bahai_date.rb, line 30
def to_s
  "#{@year.bahai_era}.#{@month.number}.#{@day.number}"
end

Private Instance Methods

ayyam_i_ha_days(year = @year.bahai_era) click to toggle source
# File lib/bahai_date/bahai_date.rb, line 56
def ayyam_i_ha_days(year = @year.bahai_era)
  Logic.leap?(year) ? 5 : 4
end
days_from_nawruz() click to toggle source
# File lib/bahai_date/bahai_date.rb, line 99
def days_from_nawruz
  days = @day.number - 1
  full_months = @month.number - 1
  full_months = 18 if @month.number == AYYAM_I_HA
  days += full_months * 19
  days += ayyam_i_ha_days if @month.number == 19
  days
end
from_gregorian() click to toggle source
# File lib/bahai_date/bahai_date.rb, line 66
def from_gregorian
  nawruz = Logic.nawruz_for(@gregorian_date.year)

  year = @gregorian_date.year - 1844
  if @gregorian_date >= nawruz
    year += 1
    days = (@gregorian_date - nawruz).to_i
  else
    days = (@gregorian_date - Logic.nawruz_for(@gregorian_date.year - 1)).to_i
  end

  # determine day and month, taking into account ayyam-i-ha
  if days >= 342
    if days < (342 + ayyam_i_ha_days(year))
      month = AYYAM_I_HA
      day = days - 342
    else
      month = 19
      day = days - (342 + ayyam_i_ha_days(year))
    end
  else
    month, day = (days).divmod(19)
    month += 1
  end
  day += 1
  [year, month, day]
end
to_gregorian() click to toggle source
# File lib/bahai_date/bahai_date.rb, line 60
def to_gregorian
  year_gregorian = @year.bahai_era + 1844 - 1
  nawruz = Logic.nawruz_for(year_gregorian)
  nawruz + days_from_nawruz
end
validate_ayyam_i_ha() click to toggle source
# File lib/bahai_date/bahai_date.rb, line 52
def validate_ayyam_i_ha
  fail ArgumentError, "'#{@day.number}' is not a valid day for Ayyam-i-Ha in the year #{@year.bahai_era}" if @month.number == AYYAM_I_HA && @day.number > ayyam_i_ha_days
end
weekday_from_gregorian() click to toggle source
# File lib/bahai_date/bahai_date.rb, line 94
def weekday_from_gregorian
  # saturday (6 in ruby) is the first day of the week
  @gregorian_date.wday == 6 ? 1 : @gregorian_date.wday + 2
end