Mô đun:TwitterSnowflake

local p = {}

local Date = require('Mô đun:Date')._Date

function p.snowflakeToDate(frame)
	local format = frame.args.format or "%B %e, %Y"
	local epoch = tonumber(frame.args.epoch) or 1288834974
	local id_str = frame.args.id_str
	if type(id_str) ~= "string" then error("đối số hỏng #1 (chuỗi dự kiến, đã lấy " .. type(id_str) .. ")", 2) end
	if type(format) ~= "string" then error("đối số hỏng #2 (chuỗi dự kiến, đã lấy " .. type(format) .. ")", 2) end
	if type(epoch) ~= "number" then error("đối số hỏng #3 (số dự kiến, đã lấy " .. type(epoch) .. ")", 2) end
	local hi, lo = 0, 0
	local hiexp = 1
	local two32 = 2^32
	for c in id_str:gmatch(".") do
		lo = lo * 10 + c
		if lo >= two32 then
			hi, lo = hi * 10^hiexp + math.floor(lo / two32), lo % two32
			hiexp = 1
		else hiexp = hiexp + 1 end
	end
	hi = hi * 10^(hiexp-1)
	local timestamp = math.floor((hi * 1024 + math.floor(lo / 4194304)) / 1000) + epoch
	return os.date(format, timestamp)
end

function p.getDate(frame)
	-- just pass frame directly to snowflakeToDate, this wraps it but the args are the same plus
	if (frame.args.id_str):match("%D") then -- not a number, so return -2
		return -2
	end
	frame.args.format = "%B %e, %Y"
	if frame.args.date then 
		frame.args.date = mw.ustring.gsub(frame.args.date, "(%d%d%d%d)%a", "%1")
	end
	frame.args.epoch = tonumber(frame.args.epoch) or 1288834974
	local epochdate = Date(os.date("%B %e, %Y", frame.args.epoch))
	local twitterdate = Date(p.snowflakeToDate(frame))
	if twitterdate == epochdate then -- created before epoch, so can't determine the date
		return -1
	end
	local date = Date(frame.args.date) or 0 -- if we error here, then an input of no date causes an error, which is contrary to the entire way {{TwitterSnowflake/datecheck}} works
	return date - twitterdate
end

local function abs_datediff(x)
	if type(x) == 'number' then return math.abs(x) end
	return math.abs(x.age_days)
end

function p.datecheck(frame)
	local args = frame.args
	if not (args.date and args.id_str) then
		error('Phải xác định date và id_str, ngay cả khi chúng trống.')
	end
	local errors = {
		args.error1 or 'Ngày không khớp của hai hoặc nhiều ngày',
		args.error2 or 'Không có ngày và đã đăng trước ngày 4 tháng 11 năm 2010',
		args.error3 or 'id_str không hợp lệ'
	}
	if mw.title.getCurrentTitle():inNamespace(0) and args.error_cat then
		for i = 1, 3 do errors[i] = errors[i] .. '[[' .. args.error_cat .. ']]' end
	end
	if not args.date:match('^%s*$') then -- #if:{{{date|}}}
		local testResult = p.getDate{ args = { date = args.date, id_str = args.id_str }}
		if testResult == -2 then return errors[3] end
		if abs_datediff(testResult) > 1 then return errors[1] end
	elseif not args.id_str:match('^%s*$') then
		local testResult = p.getDate{ args = { id_str = args.id_str }}
		if testResult == -1 then return errors[2] end
		if testResult == -2 then return errors[3] end
	end
end

return p
Chúng tôi bán
Bài viết liên quan
Lịch sử World Item & câu chuyện xoay quanh nó
Lịch sử World Item & câu chuyện xoay quanh nó
Trong truyền thuyết trò chơi YGGDRASIL, Cây Thế giới từng được bao phủ bởi vô số chiếc lá, nhưng một ngày nọ, một con quái vật khổng lồ xuất hiện và ăn tươi nuốt sống những chiếc lá này
Tiểu thuyết ma quái Ponyo: Liệu rằng tất cả mọi người đều đã biến mất
Tiểu thuyết ma quái Ponyo: Liệu rằng tất cả mọi người đều đã biến mất
Ponyo thực chất là một bộ phim kể về chuyến phiêu lưu đến thế giới bên kia sau khi ch.ết của hai mẹ con Sosuke và Ponyo chính là tác nhân gây nên trận Tsunami hủy diệt ấy.
Tóm tắt One Piece chương 1092: Sự cố
Tóm tắt One Piece chương 1092: Sự cố "Bạo chúa tấn công Thánh địa"
Chương bắt đầu với việc Kuma tiếp cận Mary Geoise. Một số lính canh xuất hiện để ngăn ông ta lại, nhưng Kuma sử dụng "Ursus Shock" để quét sạch chúng.
Genshin Impact - Hướng dẫn build đồ tối ưu cho newbie
Genshin Impact - Hướng dẫn build đồ tối ưu cho newbie
Sai lầm của 1 số newbie về việc build tướng như thế nào là tối ưu nhất vì chưa hiểu rõ role