Created
September 4, 2009 14:59
-
-
Save yrgoldteeth/180931 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Nicholas Fine | |
# [email protected] | |
# This is just my general collection of useful methods, algorithms, etc. | |
############################################################################## | |
# Get the date for the nth weekday of a given month and year. Call date_for_nth_weekday({2009,3,:monday,3}) to | |
# get the third monday of april in 2009 | |
def date_for_nth_weekday(h={:year, :month, :week_day, :nth}) | |
days_of_week = {:sunday => 0, :monday => 1, :tuesday => 2, :wednesday => 3, :thursday => 4, :friday => 5, :saturday => 6} | |
twd = days_of_week[h[:week_day]] | |
nth_wday_of_the_month(h[:year], h[:month], twd, h[:nth]) | |
end | |
def nth_wday_of_the_month(year, month, twd, n) | |
day_check = Date.new(year, month, 1) | |
while day_check.wday != twd | |
day_check += 1.day | |
end | |
(n - 1).times do | |
day_check += 7.days | |
end | |
return day_check | |
end | |
################################################################################################ | |
# Get the date for Easter sunday given a year. | |
# Found easter algorithm at http://snippets.dzone.com/posts/show/7109 under a Creative Commons 3.0 license | |
def easter(some_year) | |
golden_number = (some_year % 19) + 1 | |
if some_year <= 1752 then | |
# Julian calendar | |
dominical_number = (some_year + (some_year / 4) + 5) % 7 | |
paschal_full_moon = (3 - (11 * golden_number) - 7) % 30 | |
else | |
# Gregorian calendar | |
dominical_number = (some_year + (some_year / 4) - (some_year / 100) + (some_year / 400)) % 7 | |
solar_correction = (some_year - 1600) / 100 - (some_year - 1600) / 400 | |
lunar_correction = (((some_year - 1400) / 100) * 8) / 25 | |
paschal_full_moon = (3 - 11 * golden_number + solar_correction - lunar_correction) % 30 | |
end | |
dominical_number += 7 until dominical_number > 0 | |
paschal_full_moon += 30 until paschal_full_moon > 0 | |
paschal_full_moon -= 1 if paschal_full_moon == 29 or (paschal_full_moon == 28 and golden_number > 11) | |
difference = (4 - paschal_full_moon - dominical_number) % 7 | |
difference += 7 if difference < 0 | |
day_easter = paschal_full_moon + difference + 1 | |
if day_easter < 11 then | |
# Easter occurs in March. | |
return Date.new(y=some_year, m=3, d=day_easter + 21) | |
else | |
#Easter occurs in April. | |
return Date.new(y=some_year, m=4, d=day_easter - 10) | |
end | |
end | |
################################################################ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment