Jump to content

Module:Sandbox/R1F4T

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by R1F4T (talk | contribs) at 09:37, 23 April 2025. The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
local p = {}
local getArgs = require('Module:Arguments').getArgs
local getTimestamp = require('Module:Bengali Unix Timestamp').main

-- Return true if Bengali year is leap
local function isLeapYear(year)
	return ((year - 594) % 4 == 0)
end

-- Format the Bengali date string
local function format_date(day, month, year, format)
	local components = { d = day, m = month, y = year }
	local result = {}

	for i = 1, #format do
		local char = format:sub(i, i)
		if components[char] then
			table.insert(result, components[char])
		else
			table.insert(result, char)
		end
	end

	return table.concat(result)
end

local BN_MONTH = {
	[1] = "Boisakh", [2] = "Joishtho", [3] = "Ashar", [4] = "Shrabon",
	[5] = "Bhadro", [6] = "Ashshin", [7] = "Kartik", [8] = "Ogrohayon",
	[9] = "Poush", [10] = "Magh", [11] = "Falgun", [12] = "Chaitro"
}

function p.main(frame)
	local args = getArgs(frame)
	local format = args[2] or args['format'] or 'm d y'
	if format == '' then format = 'm d y' end

	local ts = tonumber(getTimestamp(args[2])) or tonumber(getTimestamp())
	if not ts then
		format = args[1]
		ts = getTimestamp()
	end

	local second = 86400
	local days = math.floor(ts / second)
	local year = 1432  -- Bengali epoch base year

	if days >= 0 then
		while true do
			local leap = isLeapYear(year) and 366 or 365
			if days < leap then break end
			days = days - leap
			year = year + 1
		end
	else
		while true do
			local leap = isLeapYear(year - 1) and 366 or 365
			if -days <= leap then
				year = year - 1
				days = days + leap
				break
			end
			days = days + leap
			year = year - 1
		end
	end

	local isLeap = isLeapYear(year)
	local monthLengths = {31,31,31,31,31,31,30,30,30,30,30, isLeap and 30 or 29}
	local month = 1

	while days >= monthLengths[month] do
		days = days - monthLengths[month]
		month = month + 1
	end

	local day = days + 1
	return format_date(day, BN_MONTH[month], year, format)
end

return p