「
モジュール:ヨーグレキ
」を編集中
2年1月29日 (K) 22:58時点における
Yuito
(
トーク
|
投稿記録
)
による版
(型明示しないのに暗黙のキャストをしてくれないとは舐めた真似をしてくれたな)
(
差分
)
← 古い版
|
最新版
(
差分
) |
新しい版 →
(
差分
)
ナビゲーションに移動
検索に移動
警告: このページの古い版を編集しています。
公開すると、この版以降になされた変更がすべて失われます。
警告:
ログインしていません。編集を行うと、あなたの 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 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 return yy, ym, yd end local function yogurianToGregorian(yYear, yMonth, yDay) checkYogurianValidDate(yYear, yMonth, yDay) 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) return gregorianToYogurian(tonumber(frame.args[1]),tonumber(frame.args[2]),tonumber(frame.args[3])) end local function wikiYogurianToGregorian(frame) return yogurianToGregorian(tonumber(frame.args[1]),tonumber(frame.args[2]),tonumber(frame.args[3])) end p.gregorianToYogurian = wikiGregorianToYogurian p.yogurianToGregorian = wikiYogurianToGregorian return p
編集内容の要約:
WikiWikiへの投稿はすべて、クリエイティブ・コモンズ・ゼロ(パブリックドメイン) (詳細は
WikiWiki:著作権
を参照)のもとで公開したと見なされることにご注意ください。 自分が書いたものが他の人に容赦なく編集され、自由に配布されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください。
著作権保護されている作品は、許諾なしに投稿しないでください!
編集を中止
編集の仕方
(新しいウィンドウで開きます)
このページで使用されているテンプレート:
モジュール:ヨーグレキ
(
編集
)
モジュール:ヨーグレキ/doc
(
編集
)
案内メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
モジュール
議論
English
表示
閲覧
ソースを編集
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWikiについてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報