lib/hijri/converter.rb in hijri-0.5.0 vs lib/hijri/converter.rb in hijri-0.6.0
- old
+ new
@@ -1,57 +1,68 @@
module Hijri
module Converter
def self.hijri_to_greo hijri
results = absolute_to_greo(hijri_to_absolute(hijri.year, hijri.month, hijri.day))
+
if hijri.is_a? DateTime
results.push hijri.hour, hijri.minute, hijri.second, hijri.zone
end
results
end
-
+
def self.greo_to_hijri greg
results = absolute_to_hijri(greo_to_absolute(greg.year, greg.month, greg.day))
if greg.is_a? ::DateTime
results.push greg.hour, greg.minute, greg.second, greg.zone
end
results
end
- module_function
-
+ module_function
+
# Hijri Methods
def islamic_leap_year?(year)
return (((((11 * year) + 14) % 30) < 11) ? true : false)
end
-
+
def last_day_of_islamic_month(month, year)
# Last day in month during year on the Islamic calendar.
return ((month % 2 == 1) || (month == 12 && islamic_leap_year?(year)) ? 30 : 29)
end
-
+
def hijri_to_absolute(year, month, day)
month_days = 29 * (month - 1) # days on this year
nonleap_year_days = 354 * (year - 1)
leap_year_days = (3 + (11 * year)) / 30.0
this_year = (month / 2.0).to_i
return (day + month_days + this_year + nonleap_year_days + leap_year_days + ISLAMIC_EPOCH).to_i
end
-
+
# Gregorian Methods
def last_day_of_gregorian_month(month, year)
# Compute the last date of the month for the Gregorian calendar.
if month == 2
return 29 if (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
end
return [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month - 1]
end
-
+
+ def adjust_day(year, month, day)
+ last_day = last_day_of_gregorian_month(month, year)
+ if last_day > day
+ day
+ else
+ last_day
+ end
+ end
+
# Absolute Methods
def greo_to_absolute(year, month, day)
# Computes the absolute date from the Gregorian date.
d = day
+
(month - 1).downto(1) do |m|
d += last_day_of_gregorian_month(m, year)
end
return (d + # days this year
@@ -67,19 +78,22 @@
# Search forward year by year from approximate year
year = (abs / 366.0 + 0.5).to_i
while abs >= greo_to_absolute(year + 1, 1, 1)
year += 1
end
+
# Search forward month by month from January
month = 1
while abs > greo_to_absolute(year, month, last_day_of_gregorian_month(month, year))
month += 1
+ break if month == 12
end
day = abs - greo_to_absolute(year, month, 1) + 1
+ day = adjust_day(year, month, day)
return [year, month, day]
end
-
+
def absolute_to_hijri(abs)
# Computes the Islamic date from the absolute date.
if abs <= ISLAMIC_EPOCH
# Date is pre-Islamic
month = 0