/** * @fileOverview なでしこ3 plugin_system の分割ファイル * * 日時処理(簡易)の命令を定義する。 * このファイルは単独のプラグインではなく、plugin_system.mts へマージされる。(#2351) */ import { NakoSystem } from './plugin_api.mjs' export default { // @日時処理(簡易) '元号データ': { type: 'const', value: [{ '元号': '令和', '改元日': '2019/05/01' }, { '元号': '平成', '改元日': '1989/01/08' }, { '元号': '昭和', '改元日': '1926/12/25' }, { '元号': '大正', '改元日': '1912/07/30' }, { '元号': '明治', '改元日': '1868/10/23' }] }, // @げんごうでーた '今': { // @現在時刻を「HH:mm:ss」の形式で返す // @いま type: 'func', josi: [], pure: true, fn: function() { const z2 = (n: number): string => { const ns = '00' + String(n) return ns.substring(ns.length - 2, ns.length) } const t = new Date() return z2(t.getHours()) + ':' + z2(t.getMinutes()) + ':' + z2(t.getSeconds()) } }, 'システム時間': { // @現在のUNIX時間 (UTC(1970/1/1)からの経過秒数) を返す // @しすてむじかん type: 'func', josi: [], pure: true, fn: function() { const now = new Date() return Math.floor(now.getTime() / 1000) } }, 'システム時間ミリ秒': { // @現在のUNIX時間 (UTC(1970/1/1)からの経過秒数) をミリ秒で返す // @しすてむじかんみりびょう type: 'func', josi: [], pure: true, fn: function() { const now = new Date() return now.getTime() } }, '今日': { // @今日の日付を「YYYY/MM/DD」の形式で返す // @きょう type: 'func', josi: [], pure: true, fn: function(sys: NakoSystem) { return sys.__formatDate(new Date()) } }, '明日': { // @明日の日付を「YYYY/MM/DD」の形式で返す // @あした type: 'func', josi: [], pure: true, fn: function(sys: NakoSystem) { const t = Date.now() + (24 * 60 * 60 * 1000) return sys.__formatDate(new Date(t)) } }, '昨日': { // @昨日の日付を「YYYY/MM/DD」の形式で返す // @きのう type: 'func', josi: [], pure: true, fn: function(sys: NakoSystem) { const t = Date.now() - (24 * 60 * 60 * 1000) return sys.__formatDate(new Date(t)) } }, '今年': { // @今年が何年かを西暦で返す // @ことし type: 'func', josi: [], pure: true, fn: function() { return (new Date()).getFullYear() } }, '来年': { // @来年が何年かを西暦で返す // @らいねん type: 'func', josi: [], pure: true, fn: function() { return (new Date()).getFullYear() + 1 } }, '去年': { // @去年が何年かを西暦で返す // @きょねん type: 'func', josi: [], pure: true, fn: function() { return (new Date()).getFullYear() - 1 } }, '今月': { // @今月が何月かを返す // @こんげつ type: 'func', josi: [], pure: true, fn: function() { return (new Date()).getMonth() + 1 } }, '来月': { // @来月が何月かを返す // @らいげつ type: 'func', josi: [], pure: true, fn: function() { return (new Date()).getMonth() + 2 } }, '先月': { // @先月が何月かを返す // @せんげつ type: 'func', josi: [], pure: true, fn: function() { return (new Date()).getMonth() } }, '曜日': { // @Sに指定した日付の曜日を返す。不正な日付の場合は今日の曜日を返す。 // @ようび type: 'func', josi: [['の']], pure: true, fn: function(s: string, sys: any) { const d = sys.__str2date(s) return '日月火水木金土'.charAt(d.getDay() % 7) } }, '曜日番号取得': { // @Sに指定した日付の曜日番号を番号で返す。不正な日付の場合は今日の曜日番号を返す。(0=日/1=月/2=火/3=水/4=木/5=金/6=土) // @ようびばんごうしゅとく type: 'func', josi: [['の']], pure: true, fn: function(s: any) { const a = s.split('/') const t = new Date(a[0], a[1] - 1, a[2]) return t.getDay() } }, 'UNIXTIME変換': { // @日時SをUNIX時間 (UTC(1970/1/1)からの経過秒数) に変換して返す(v1非互換) // @UNIXTIMEへんかん type: 'func', josi: [['の', 'を', 'から']], pure: true, fn: function(s: string, sys: any) { const d = sys.__str2date(s) return d.getTime() / 1000 } }, 'UNIX時間変換': { // @日時SをUNIX時間 (UTC(1970/1/1)からの経過秒数) に変換して返す(v1非互換) // @UNIXじかんへんかん type: 'func', josi: [['の', 'を', 'から']], pure: true, fn: function(s: string, sys: any) { const d = sys.__str2date(s) return d.getTime() / 1000 } }, '日時変換': { // @UNIX時間 (UTC(1970/1/1)からの経過秒数) を「YYYY/MM/DD HH:mm:ss」の形式に変換 // @にちじへんかん type: 'func', josi: [['を', 'から']], pure: true, fn: function(tm: any, sys: any) { const t = tm * 1000 return sys.__formatDateTime(new Date(t), '2022/01/01 00:00:00') } }, '日時書式変換': { // @UNIX時間TM(または日付文字列)を「YYYY/MM/DD HH:mm:ss」または「YY-M-D H:m:s」その他、W:曜日、WWW:曜日英、MMM:月英、ccc:ミリ秒の書式に変換 // @にちじしょしきへんかん type: 'func', josi: [['を'], ['で']], pure: true, fn: function(tm: any, fmt: any, sys: any) { const t = sys.__str2date(tm) fmt = fmt.replace(/(YYYY|ccc|WWW|MMM|YY|MM|DD|HH|mm|ss|[MDHmsW])/g, (m: string) => { switch (m) { case 'YYYY': return t.getFullYear() case 'YY': return (String(t.getFullYear())).substring(2) case 'MM': return sys.__zero2(String(t.getMonth() as number + 1)) case 'DD': return sys.__zero2(t.getDate()) case 'M': return (t.getMonth() as number + 1) case 'D': return (t.getDate()) case 'HH': return sys.__zero2(t.getHours()) case 'mm': return sys.__zero2(t.getMinutes()) case 'ss': return sys.__zero2(t.getSeconds()) case 'ccc': return sys.__zero(t.getMilliseconds(), 3) case 'H': return (t.getHours()) case 'm': return (t.getMinutes()) case 's': return (t.getSeconds()) case 'W': return '日月火水木金土'.charAt(t.getDay() % 7) case 'WWW': return ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'][t.getDay() % 7] case 'MMM': return ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][t.getMonth()] } return m }) return fmt } }, '和暦変換': { // @Sを和暦に変換する。Sは明治以降の日付が有効。 // @われきへんかん type: 'func', josi: [['を']], pure: true, fn: function(s: string, sys: NakoSystem) { const d = sys.__str2date(s) const t = d.getTime() for (const era of sys.__getSysVar('元号データ')) { const gengo = String(era['元号']) const d2 = sys.__str2date(era['改元日']) const t2 = d2.getTime() if (t2 <= t) { let y: any = (d.getFullYear() - d2.getFullYear()) + 1 if (y === 1) { y = '元' } return gengo + String(y) + '年' + sys.__zero2(d.getMonth() + 1) + '月' + sys.__zero2(d.getDate()) + '日' } } throw new Error('『和暦変換』は明示以前の日付には対応していません。') } }, '年数差': { // @日付AとBの差を年数で求めて返す。A