「
モジュール:ヨーグレキ
」を編集中
ナビゲーションに移動
検索に移動
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。
スパム攻撃防止用のチェックです。 けっして、ここには、値の入力は
しない
でください!
local p = {} MONTH_DAYS = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} local function isLeap(year) return year % 4 == 0 and (year % 100 ~= 0 or year % 400 == 0) end local function leapdays(y1, y2) y1 = y1 - 1 y2 = y2 - 1 return (math.floor(y2 / 4) - math.floor(y1 / 4)) - (math.floor(y2 / 100) - math.floor(y1 / 100)) + (math.floor(y2 / 400) - math.floor(y1 / 400)) end local function isValidDate(gYear, gMonth, gDay) return gMonth > 0 and gMonth <= 12 and gDay > 0 and gDay <= (MONTH_DAYS[gMonth] + ((gMonth == 2 and isLeap(gYear)) and 1 or 0)) end local function isYogurianValidDate(yYear, yMonth, yDay) return yYear ~= 0 and yMonth > 0 and yMonth <= 12 and yDay > 0 and yDay <= 30 + (yMonth == 1 and (isLeap(yYear + 2020) and 6 or 5) or 0) end local function checkValidDate(gYear, gMonth, gDay) if not isValidDate(gYear, gMonth, gDay) then error(string.format("Date %d-%d-%d is invalid.", gYear, gMonth, gDay)) end end local function checkYogurianValidDate(yYear, yMonth, yDay) if not isYogurianValidDate(yYear, yMonth, yDay) then error(string.format("Yogurian date %d-%d-%d is invalid.", yYear, yMonth, yDay)) end end local function ddCalculate(y1, m1, d1, y2, m2, d2) yd = y2 - y1 dd = yd * 365 + leapdays(y1, y2 + 1) if isLeap(y1) then if m1 > 2 then dd = dd - 1 end end if isLeap(y2) and y1 < y2 then if m2 < 3 then dd = dd - 1 end end for mi = 1, m2 - 1 do dd = dd + MONTH_DAYS[mi] end for mi = 1, m1 - 1 do dd = dd - MONTH_DAYS[mi] end dd = dd + d2 - d1 return dd end local function gregorianToYogurian(gYear, gMonth, gDay) checkValidDate(gYear, gMonth, gDay) isLeapB = isLeap(gYear + (gMonth >= 11 and 1 or 0)) d = ddCalculate(2020, 11, 1, gYear, gMonth, gDay) yy = gYear - 2019 - (gMonth >= 11 and 0 or 1) dfn = d - 365 * (yy - 1) - leapdays(2021, gYear + (gMonth >= 11 and 1 or 0)) + 1 hmd = isLeapB and 36 or 35 ym = dfn <= hmd and 1 or math.floor((dfn - hmd - 1) / 30) + 2 yd = ym == 1 and dfn or (dfn - hmd - 1) % 30 + 1 yy = yy < 1 and yy - 1 or yy return {yy, ym, yd} end local function yogurianToGregorian(yYear, yMonth, yDay) checkYogurianValidDate(yYear, yMonth, yDay) yYear = yYear < 0 and yYear + 1 or yYear isLeapB = isLeap(yYear + 2020) gDay = yMonth == 1 and yDay or (yMonth - 2) * 30 + (isLeapB and 36 or 35) + yDay gYear = yYear + 2019 + (gDay > 61 and 1 or 0) gMonth = 11 while true do gMonth = gMonth - (gMonth > 12 and 12 or 0) monthDay = MONTH_DAYS[gMonth] + ((isLeapB and gMonth == 2) and 1 or 0) if gDay <= monthDay then break end gDay = gDay - monthDay gMonth = gMonth + 1 end return {gYear, gMonth, gDay} end local function wikiGregorianToYogurian(frame) yDate = gregorianToYogurian(tonumber(frame.args[1]),tonumber(frame.args[2]),tonumber(frame.args[3])) return string.format(frame.args[4],yDate[1],yDate[2],yDate[3]) end local function wikiYogurianToGregorian(frame) gDate = yogurianToGregorian(tonumber(frame.args[1]),tonumber(frame.args[2]),tonumber(frame.args[3])) return string.format(frame.args[4],gDate[1],gDate[2],gDate[3]) end p.isLeap = isLeap p.leapdays = leapdays p.checkValidDate = checkValidDate p.checkYogurianValidDate = checkYogurianValidDate p.ddCalculate = ddCalculate p.gregorianToYogurianL = gregorianToYogurian p.yogurianToGregorianL = yogurianToGregorian p.gregorianToYogurian = wikiGregorianToYogurian p.yogurianToGregorian = wikiYogurianToGregorian return p
編集内容の要約:
WikiWikiへの投稿はすべて、クリエイティブ・コモンズ・ゼロ(パブリックドメイン) (詳細は
WikiWiki:著作権
を参照)のもとで公開したと見なされることにご注意ください。 自分が書いたものが他の人に容赦なく編集され、自由に配布されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください。
著作権保護されている作品は、許諾なしに投稿しないでください!
編集を中止
編集の仕方
(新しいウィンドウで開きます)
このページで使用されているテンプレート:
モジュール:ヨーグレキ
(
編集
)
モジュール:ヨーグレキ/doc
(
編集
)
案内メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
モジュール
議論
English
表示
閲覧
ソースを編集
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWikiについてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報