มอดูล:ตัวอย่างหรคุณจูเลียน
มอดูลนี้ได้รับการจัดอันดับว่าพร้อมใช้งานทั่วไป มีความสมบูรณ์แล้วและคิดว่าจะปราศจากข้อผิดพลาดและพร้อมสำหรับการใช้งานตามความเหมาะสม พร้อมจะกล่าวถึงในหน้าช่วยเหลือและแหล่งข้อมูลวิกิพีเดียอื่น ๆ ว่าเป็นตัวเลือกสำหรับผู้ใช้ใหม่ในการเรียนรู้ เพื่อลดภาระของเซิร์ฟเวอร์และเอาต์พุตที่ไม่ดี ควรปรับปรุงโดยการทดสอบที่กระบะทราย แทนที่จะแก้ไขแบบลองผิดลองถูกซ้ำ ๆ |
มอดูล ตัวอย่างหรคุณจูเลียน นี้ ใช้สำหรับแสดงผลตัวอย่างการคำนวณประกอบบทความ หรคุณจูเลียน และสามารถนำไปใช้ในการคำนวณหรคุณจูเลียน (หรือวันที่จูเลียน) ได้ตามปกติ (แต่ควรจะดัดแปลงแก้ไขเป็นฟังก์ชันเฉพาะหรือมอดูลเฉพาะ เพราะโค้ดในมอดูลนี้สามารถส่งค่าอื่นที่เป็นค่ามัธยันตร์ (intermediate) ระหว่างการคำนวณออกมา นอกเหนือจากค่าผลลัพธ์สุดท้าย) นอกจากนี้ยังสามารถใช้แสดงขั้นตอนในการคำนวณวันมหาสงกรานต์และวันเถลิงศกได้ด้วย
ในมอดูลนี้ประกอบด้วยฟังก์ชัน 5 ฟังก์ชัน คือ
- calcjd คำนวณหรคุณจูเลียนของวันที่ dy เดือน mo ปี ค.ศ. yr ตามวิธีของ Doggett (1992)
- calcjd2 ทำงานเช่นเดียวกับ calcjd แต่ใช้วิธีของ Jean Meeus
- calcdatefromjd คำนวณวันที่จากหรคุณจูเลียนที่กำหนดให้
- calcdatefromjd2 ทำงานเช่นเดียวกับ calcdatefromjd
- jdnewariesandnewyear ใช้คำนวณหาวันมหาสงกรานต์และวันเถลิงศก
การใช้งาน[แก้]
สำหรับฟังก์ชัน calcjd และ calcjd2 ระบุปีคริสต์ศักราช เดือน วันที่ และเลขลำดับตัวแปรที่ต้องการส่งออกตามลำดับ
{{#invoke:ตัวอย่างหรคุณจูเลียน|calcjd หรือ calcjd2|yr|mo|dy|lineno}}
สำหรับฟังก์ชัน calcdatefromjd และ calcdatefromjd2 ระบุหรคุณ ณ เวลา 12 นาฬิกาของวันที่ต้องการ จะส่งค่าวันที่ เดือน ปี หรือค่าคำนวณอื่นออกมา
{{#invoke:ตัวอย่างหรคุณจูเลียน|calcdatefromjd หรือ calcdatefromjd2|jd|lineno}}
สำหรับฟังก์ชัน jdnewariesandnewyear ระบุ ค.ศ. ที่ต้องการหา และเลือกโหมดว่า จะคำนวณวันมหาสงกรานต์หรือวันเถลิงศก
{{#invoke:ตัวอย่างหรคุณจูเลียน|jdnewariesandnewyear|year|mode|lineno}}
รายละเอียดของค่า lineno ที่เหมาะสมโปรดอ่านในฟังก์ชัน
คู่มือการใช้งานที่ปรากฏด้านบนนี้ดึงมาจาก มอดูล:ตัวอย่างหรคุณจูเลียน/doc (แก้ | ประวัติ) ผู้เขียนสามารถทำการทดลองได้ที่กระบะทราย (สร้าง | คัดลอก) และชุดทดสอบ (สร้าง) ของมอดูลนี้ หน้าย่อยของมอดูลนี้ |
--[[
มอดูล: ตัวอย่างหรคุณจูเลียน
ประโยชน์: สำหรับแสดงตัวอย่างการคำนวณในบทความ หรคุณจูเลียน และ สงกรานต์ เนื่องจากการแสดงตัวอย่างโดยคำสั่ง #expr:
แก้ไขได้ยาก อ่านเข้าใจยาก มอดูลนี้ไม่ใช้ในการคำนวณหรคุณจูเลียน สำหรับเครื่องมือในการคำนวณ โปรดดู แม่แบบ:หรคุณจูเลียน
วิธีการเรียกใช้งานพึงปฏิบัติดังนี้
{{#invoke|ตัวอย่างหรคุณจูเลียน|ชื่่อฟังก์ชัน|ตัวแปรรับเข้าคั่นด้วยขีดตั้ง}}
ในมอดูลนี้มีฟัง5 ชัน 6 ฟังก์ชันด้วยกัน คือ
1. calcjd(yr,mo,dy,hr,mn,sc,lineno) หาหรคุณจูเลียน
2. calcjd2(yr,mo,dy,hr,mn,sc,lineno)
3. calcdatefromjd(jd,lineno) หาวันที่จากหรคุณจูเลียน ณ เวลา 12 นาฬิกา
4. calcdatefromhd2(jd,lineno)
5. jdnewariesandnewyear(yr,mode,lineno) หาหรคุณจูเลียน ณ วันมหาสงกรานต์ ถ้า mode = 1 หรือหาหรคุณจูเลียน ณ วันเถลิงศก ถ้า mode เป็นค่าอื่น
กำหนด วันที่ dy เดือน mo ปีคริสตศักราช yr ส่วน lineno แทนลำดับของตัวแปรที่จะส่งออกไปประกอบตัวอย่าง
--]]
local p = {}
function p.calcjd(frame)
-- ในวิกิการระบุตัวแปรรับเข้าทุกตัวไว้ในวงเล็บเริ่มฟังก์ชันไม่สามารถทำได้ แต่ภาษาลูอาปกติรองรับ
-- การกระทำดังกล่าว เช่นเดียวกับภาษาอื่น
local yr = tonumber(frame.args[1])
local mo = tonumber(frame.args[2])
local dy = tonumber(frame.args[3])
local lineno = tonumber(frame.args[4])
local line1 = math.floor((1461 * (yr + 4800 + math.floor((mo - 14)/12)))/4)
local line2 = math.floor((367 * (mo - 2 - 12 * math.floor((mo - 14)/12)))/12)
local line3 = math.floor((3 * math.floor((yr + 4900 + math.floor((mo - 14)/12))/100))/4)
local line4 = dy - 32077
local jd = line1 + line2 - line3 + line4
local result
if lineno == 1 then
result = line1
elseif lineno == 2 then
result = line2
elseif lineno == 3 then
result = line3
elseif lineno == 4 then
result = line4
else
result = jd
end
return result
end
function p.calcjd2(frame)
--[[
ดูเพิ่ม Meeus, Jean (1998). Astronomical Algorithms. Willman Bell. pp. 60–61.
--]]
local yr = tonumber(frame.args[1])
local mo = tonumber(frame.args[2])
local dy = tonumber(frame.args[3])
local lineno = tonumber(frame.args[4])
if mo<=2 then
mo = mo + 12
yr = yr - 1
end
local A = math.floor(yr/100)
local B = 2 - A + math.floor(A/4)
local jd = math.floor(365.25 * (yr + 4716)) + math.floor(30.6001 * (mo+1)) + dy + B - 1524
local result
if lineno == 1 then
result = mo
elseif lineno == 2 then
result = yr
elseif lineno == 3 then
result = A
elseif lineno == 4 then
result = B
else
result = jd
end
return result
end
function p.calcdatefromjd(frame)
--[[
แปลงหรคุณจูเลียน jd ณ เวลา 12 นาฬิกา เป็นวันที่
lineno เป็นตัวเลขกำกับสำหรับระบุค่าคำนวณที่จะส่งออก เรียงตามลำดับบรรทัด
--]]
local jd = tonumber(frame.args[1])
local lineno = tonumber(frame.args[2])
local f = jd + 1401 + math.floor((math.floor((4*jd + 274277)/146097)*3)/4) -38
local e = 4*f + 3
local g = math.floor(math.fmod(e, 1461)/4)
local h = 5*g + 2
local dy = math.floor((math.fmod(h, 153))/5) + 1
local mo = math.fmod(math.floor(h/153) + 2, 12) + 1
local yr = math.floor(e/1461) - 4716 + math.floor((12 + 2 - mo)/12)
local result
if lineno == 1 then
result = f
elseif lineno == 2 then
result = e
elseif lineno == 3 then
result = g
elseif lineno == 4 then
result = h
elseif lineno == 5 then
result = dy
elseif lineno == 6 then
result = mo
else
result = yr
end
return result
end
function p.calcdatefromjd2(frame)
--[[
ดูเพิ่ม Meeus, Jean (1998). Astronomical Algorithms. Willman Bell.
และโค้ดใน https://www.esrl.noaa.gov/gmd/grad/solcalc/sunrise.html
--]]
local jd = tonumber(frame.args[1])
local lineno = tonumber(frame.args[2])
local z = math.floor(jd)
local A
if z < 2299161 then
A = z;
else
local alpha = math.floor((z - 1867216.25)/36524.25)
A = z + 1 + alpha - math.floor(alpha/4)
end
local B = A + 1524
local C = math.floor((B - 122.1)/365.25)
local D = math.floor(365.25 * C)
local E = math.floor((B - D)/30.6001)
local dy = B - D - math.floor(30.6001 * E)
local mo
if E < 14 then
mo = E - 1
else
mo = E - 13
end
local yr
if mo > 2 then
yr = C - 4716
else
yr = C - 4715
end
local result
if lineno == 1 then
result = z
elseif lineno == 2 then
result = A
elseif lineno == 3 then
result = B
elseif lineno == 4 then
result = C
elseif lineno == 5 then
result = D
elseif lineno == 6 then
result = E
elseif lineno == 7 then
result = dy
elseif lineno == 8 then
result = mo
else
result = yr
end
return result
end
function p.jdnewariesandnewyear(frame)
--[[
คำนวณหรคุณ ณ เวลาสงกรานต์เสด็จ ของปี จ.ศ. y - 638 เมื่อ y เป็น ค.ศ.
--]]
yr = tonumber(frame.args[1])
mode = tonumber(frame.args[2])
lineno = tonumber(frame.args[3])
local sd0, sd, jd0, jd
if mode == 1 then
sd0 = ((yr-638)*292207-1359)/800
else
sd0 = ((yr-638)*292207+373)/800
end
jd0 = sd0 + 1954167.5
-- เศษเวลา
local timefrac1 = jd0 - math.floor(jd0)
if timefrac1 >= 0.5 then
-- ทศนิยมของหรคุณจูเลียน เถิน 0.5 เป็นวันใหม่ทางสุริยคติ ต้องลบออกเสีย 0.5 ก่อนคิดเวลา
timefrac2 = timefrac1 - 0.5
jd = math.floor(jd0) + 1
else
-- ทศนิยมน้อยกว่า 0.5 เลยเที่ยงวันมา ต้องเอา 0.5 บวกก่อนคิดเวลา
timefrac2 = timefrac1 + 0.5
jd = math.floor(jd0)
end
local hr = math.floor(timefrac2*24)
local rem = timefrac2*24 - hr
local mn = math.floor(rem*60)
local rem2 = rem*60 - mn
local sc = math.floor(rem2*60)
local rem3 = rem2*60 - sc
local result
if lineno == 1 then
result = sd0
elseif lineno == 2 then
result = jd0
elseif lineno == 3 then
result = sd
elseif lineno == 4 then
result = jd
elseif lineno == 5 then
result = timefrac1
elseif lineno == 6 then
result = timefrac2
elseif lineno == 7 then
result = hr
elseif lineno ==8 then
result = rem
elseif lineno == 9 then
result = mn
elseif lineno == 10 then
result = rem2
elseif lineno == 11 then
result = sc
else
result = rem3
end
return result
end
return p