Jump to content

Module:Calendar date/recurring

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Holly Cheng (talk | contribs) at 22:08, 26 March 2019 (Created page with '--[[ Calculates the Gregorian date of a recurring holiday that varies year-to-year, but follows the rule "Nth [day of week] of [month]" "month" = month numb...'). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
(diff) ← Previous revision | Latest revision (diff) | Newer revision → (diff)

--[[ 

Calculates the Gregorian date of a recurring holiday that varies year-to-year, but follows the rule "Nth [day of week] of [month]"

  "month" = month number (1 to 12)
  "weeknumber" = number of week (1 to 4, or -1 to mean "last")
  "dayofweek" = number that represents the day of the week, where 1 = Sunday and 7 = Saturday
  "year" = Gregorian calendar year
               
 ]]

require('Module:No globals')

local p = {}

function p.calculate(frame)
	local pframe = frame:getParent()
	local args = pframe.args

	local ONE_DAY = 86400 -- number of seconds in one day
	local date = os.time{year=args.year, month=args.month, day=1}
	local dateparts = os.date("*t", date)

	-- find the first [dayofweek] of this month
	while not dateparts["wday"] == args.dayofweek do
		date = date + ONE_DAY
		dateparts = os.date("*t", date)
	end

	-- add the correct number of weeks
	if weeknumber > 1 then
		date = date + ((weeknumber - 1) * (7 * ONE_DAY))
	end

	local result = os.time("%Y-%m-%d", date)
	return result
end

return p