lib/hijri/date.rb in hijri-0.4.0 vs lib/hijri/date.rb in hijri-0.5.0

- old
+ new

@@ -3,14 +3,12 @@ include Comparable attr_reader :day, :month, :year - # TODO change mon to month in format.rb. alias :mon :month alias :mday :day - MONTHNAMES = [nil] + %w(Muharram Safar Rabia-Awwal Rabia-Thani Jumaada-Awal Jumaada-Thani Rajab Sha'ban Ramadan Shawwal Dhul-Qi'dah Dhul-Hijjah) DAYNAMES = %w(as-Sabt al-Ahad al-Ithnayn ath-Thalaathaa al-Arba'aa' al-Khamis al-Jumu'ah) ABBR_MONTHNAMES = [nil] + ["Muharram", "Safar", "Rabia I", "Rabia II", "Jumaada I", "Jumaada II", "Rajab", "Sha'ban", "Ramadan", "Shawwal", "Dhul-Qi'dah", "Dhul-Hijjah"] ABBR_DAYNAMES = %w(Sabt Ahad Ithnayn Thalaathaa Arba'aa' Khamis Jumu'ah) @@ -34,32 +32,37 @@ date.to_hijri end end def initialize(year=1, month=1, day=1) - @year, @month, @day = year, month, day + if valid_date?(year, month, day) + @year, @month, @day = year, month, day + else + raise ArgumentError, "Invalid Date" + end end - - def islamic_leap_year? - return (((((11 * self.year) + 14) % 30) < 11) ? true : false) + + def change(kargs) + # Remove nil values + kargs.reject!{|k,v| v.nil?} + @year = kargs.fetch :year , year + @month = kargs.fetch :month, month + @day = kargs.fetch :day , day end - def last_day_of_islamic_month - # Last day in month during year on the Islamic calendar. - return ((self.month % 2 == 1) || (self.month == 12 && islamic_leap_year?) ? 30 : 29) - end - def to_s - "#{@year}-#{sprintf('%02d', @month)}-#{sprintf('%02d', @day)}" + format('%.4d-%02d-%02d', year, month, day) end def <=>(date) # Make sure the date is a Hijri::Date instance date = date.to_hijri if self.to_s == date.to_s return 0 - elsif @year > date.year || (@year == date.year && @month > date.month) || (@year == date.year && @month == date.month && @day > date.day) + elsif @year > date.year || + (@year == date.year && @month > date.month) || + (@year == date.year && @month == date.month && @day > date.day) return 1 else return -1 end end @@ -79,9 +82,16 @@ end # Just to have a consistent Interface. def to_hijri self + end + + def valid_date?(year, month, day) + return false unless (1..INFINITY).cover?(year) + return false unless (1..12).cover?(month) + return false unless (1..30).cover?(day) + return true end def yday (((month - 1) * AVERAGE_MONTH_DAYS) + day).floor end