nadesiko3
Version:
Japanese Programming Language
395 lines (361 loc) • 11.6 kB
JavaScript
// PluginDateTime
import dayjs from 'dayjs'
import _ja from 'dayjs/locale/ja.js'
import era from './era.mjs'
const PluginDateTime = {
'初期化': {
type: 'func',
josi: [],
pure: true,
fn: function (sys) {
}
},
// @日時処理
'元号データ': { type: 'const', value: era }, // @げんごうでーた
'今': { // @現在時刻を「HH:mm:ss」の形式で返す // @いま
type: 'func',
josi: [],
pure: true,
fn: function () {
return dayjs().format('HH:mm:ss')
}
},
'システム時間': { // @現在のUNIX時間 (UTC(1970/1/1)からの経過秒数) を返す // @しすてむじかん
type: 'func',
josi: [],
pure: true,
fn: function () {
return dayjs().unix()
}
},
'今日': { // @今日の日付を「YYYY/MM/DD」の形式で返す // @きょう
type: 'func',
josi: [],
pure: true,
fn: function () {
return dayjs().format('YYYY/MM/DD')
}
},
'明日': { // @明日の日付を「YYYY/MM/DD」の形式で返す (v1非互換) // @あす
type: 'func',
josi: [],
pure: true,
fn: function () {
return dayjs().add(1, 'days').format('YYYY/MM/DD')
}
},
'昨日': { // @昨日の日付を「YYYY/MM/DD」の形式で返す (v1非互換) // @きのう
type: 'func',
josi: [],
pure: true,
fn: function () {
return dayjs().subtract(1, 'days').format('YYYY/MM/DD')
}
},
'今年': { // @今年が何年かを西暦で返す // @ことし
type: 'func',
josi: [],
pure: true,
fn: function () {
return dayjs().year()
}
},
'来年': { // @来年が何年かを西暦で返す // @らいねん
type: 'func',
josi: [],
pure: true,
fn: function () {
return dayjs().add(1, 'years').year()
}
},
'去年': { // @去年が何年かを西暦で返す // @きょねん
type: 'func',
josi: [],
pure: true,
fn: function () {
return dayjs().subtract(1, 'years').year()
}
},
'今月': { // @今月が何月かを返す // @こんげつ
type: 'func',
josi: [],
pure: true,
fn: function () {
return dayjs().month() + 1
}
},
'来月': { // @来月が何月かを返す // @らいげつ
type: 'func',
josi: [],
pure: true,
fn: function () {
return dayjs().add(1, 'months').month() + 1
}
},
'先月': { // @先月が何月かを返す // @せんげつ
type: 'func',
josi: [],
pure: true,
fn: function () {
return dayjs().subtract(1, 'months').month() + 1
}
},
'曜日': { // @日付Sの曜日を返す // @ようび
type: 'func',
josi: [['の']],
pure: true,
fn: function (s) {
return dayjs(s, 'YYYY/MM/DD').locale('ja').format('ddd')
}
},
'曜日番号取得': { // @Sに指定した日付の曜日番号をで返す。不正な日付の場合は今日の曜日番号を返す。(0=日/1=月/2=火/3=水/4=木/5=金/6=土) // @ようびばんごうしゅとく
type: 'func',
josi: [['の']],
pure: true,
fn: function (s) {
let t = dayjs(s, 'YYYY/MM/DD')
if (!t.isValid()) {
t = dayjs()
}
return t.locale('ja').format('d')
}
},
'UNIX時間変換': { // @日時SをUNIX時間 (UTC(1970/1/1)からの経過秒数) に変換して返す(v1非互換) // @UNIXじかんへんかん
type: 'func',
josi: [['の', 'を', 'から']],
pure: true,
fn: function (s, sys) {
return sys.__exec('UNIXTIME変換', [s])
}
},
'UNIXTIME変換': { // @日時SをUNIX時間 (UTC(1970/1/1)からの経過秒数) に変換して返す // @UNIXTIMEへんかん
type: 'func',
josi: [['の', 'を', 'から']],
pure: true,
fn: function (s) {
return dayjs(s, 'YYYY/MM/DD HH:mm:ss').unix()
}
},
'日時変換': { // @UNIX時間 (UTC(1970/1/1)からの経過秒数) を「YYYY/MM/DD HH:mm:ss」の形式に変換 // @にちじへんかん
type: 'func',
josi: [['を', 'から']],
pure: true,
fn: function (tm) {
return dayjs.unix(tm).format('YYYY/MM/DD HH:mm:ss')
}
},
'和暦変換': { // @Sを和暦に変換する。Sは明治以降の日付が有効。 // @われきへんかん
type: 'func',
josi: [['を']],
pure: true,
fn: function (s, sys) {
const date = dayjs(s, 'YYYY/MM/DD')
for (const era of sys.__v0['元号データ']) {
const eraBeginDate = dayjs(era['改元日'], 'YYYY/MM/DD')
if (eraBeginDate <= date) {
let eraYear = date.format('YYYY') - eraBeginDate.format('YYYY') + 1
if (eraYear === 1) {
eraYear = '元'
}
return era['元号'] + eraYear + '/' + date.format('MM/DD')
}
}
throw new Error('『和暦変換』は明治以前の日付には対応していません。')
}
},
'年数差': { // @日付AとBの差を年数で求めて返す。A<Bなら正の数、そうでないなら負の数を返す (v1非互換)。 // @ねんすうさ
type: 'func',
josi: [['と', 'から'], ['の', 'までの']],
pure: true,
fn: function (a, b, sys) {
return sys.__exec('日時差', [a, b, '年'])
}
},
'月数差': { // @日付AとBの差を月数で求めて返す。A<Bなら正の数、そうでないなら負の数を返す (v1非互換)。 // @げっすうさ
type: 'func',
josi: [['と', 'から'], ['の', 'までの']],
pure: true,
fn: function (a, b, sys) {
return sys.__exec('日時差', [a, b, '月'])
}
},
'日数差': { // @日付AとBの差を日数で求めて返す。A<Bなら正の数、そうでないなら負の数を返す。 // @にっすうさ
type: 'func',
josi: [['と', 'から'], ['の', 'までの']],
pure: true,
fn: function (a, b, sys) {
return sys.__exec('日時差', [a, b, '日'])
}
},
'日時差': { // @日時AとBの差を種類unitで返す。A<Bなら正の数、そうでないなら負の数を返す (v1非互換)。 // @にちじさ
type: 'func',
josi: [['と', 'から'], ['の', 'までの'], ['による']],
pure: true,
fn: function (a, b, unit) {
switch (unit) {
case '年':
unit = 'years'
break
case '月':
unit = 'months'
break
case '日':
unit = 'days'
break
case '時間':
unit = 'hours'
break
case '分':
unit = 'minutes'
break
case '秒':
unit = 'seconds'
break
default:
break
}
const maxCount = 2
for (let i = 0; i < maxCount; i++) {
const dts = []
for (const s of [b, a]) {
let s_ = s
if (i === maxCount - 1) {
s_ = '1980/01/01 ' + s_
}
const t = dayjs(s_, 'YYYY/MM/DD HH:mm:ss')
if (t.isValid()) {
dts.push(t)
}
}
if (dts.length === 2) {
return dts[0].diff(dts[1], unit)
}
}
throw new Error('時間差が正常に算出できませんでした。')
}
},
'時間差': { // @時間AとBの時間の差を求めて返す。A<Bなら正の数、そうでないなら負の数を返す。 // @じかんさ
type: 'func',
josi: [['と', 'から'], ['の', 'までの']],
pure: true,
fn: function (a, b, sys) {
return sys.__exec('日時差', [a, b, '時間'])
}
},
'分差': { // @時間AとBの分数の差を求めて返す。A<Bなら正の数、そうでないなら負の数を返す。 // @ふんさ
type: 'func',
josi: [['と', 'から'], ['の', 'までの']],
pure: true,
fn: function (a, b, sys) {
return sys.__exec('日時差', [a, b, '分'])
}
},
'秒差': { // @時間AとBの差を秒差で求めて返す。A<Bなら正の数、そうでないなら負の数を返す。 // @びょうさ
type: 'func',
josi: [['と', 'から'], ['の', 'までの']],
pure: true,
fn: function (a, b, sys) {
return sys.__exec('日時差', [a, b, '秒'])
}
},
'時間加算': { // @時間SにAを加えて返す。Aには「(+|-)hh:nn:dd」で指定する。 // @じかんかさん
type: 'func',
josi: [['に'], ['を']],
pure: true,
fn: function (s, a, sys) {
const pm = a.slice(0, 1)
if (pm !== '+' && pm !== '-') {
throw new Error('『時間加算』命令の引数Aは「(+|-)hh:nn:dd」で指定します。')
}
const n = a.slice(1).split(':')
const units = ['時間', '分', '秒']
for (let i = 0; i < n.length; i++) {
s = sys.__exec('日時加算', [s, pm + n[i] + units[i]])
}
return s
}
},
'日付加算': { // @日付SにAを加えて返す。Aには「(+|-)yyyy/mm/dd」で指定する。 // @ひづけかさん
type: 'func',
josi: [['に'], ['を']],
pure: true,
fn: function (s, a, sys) {
const pm = a.slice(0, 1)
if (pm !== '+' && pm !== '-') {
throw new Error('『日付加算』命令の引数Aは「(+|-)yyyy/mm/dd」で指定します。')
}
const n = a.slice(1).split('/')
const units = ['年', 'ヶ月', '日']
for (let i = 0; i < n.length; i++) {
s = sys.__exec('日時加算', [s, pm + n[i] + units[i]])
}
return s
}
},
'日時加算': { // @日時SにAを加えて返す。Aは「(+|-)1(年|ヶ月|日|時間|分|秒)」のように指定する (v1非互換)。 // @にちじかさん
type: 'func',
josi: [['に'], ['を']],
pure: true,
fn: function (s, a) {
let unit
switch (a.match(/(年|ヶ月|日|時間|分|秒)$/)[0]) {
case '年':
unit = 'years'
break
case 'ヶ月':
unit = 'months'
break
case '日':
unit = 'days'
break
case '時間':
unit = 'hours'
break
case '分':
unit = 'minutes'
break
case '秒':
unit = 'seconds'
break
default:
break
}
const dateFormat = 'YYYY/MM/DD'
const timeFormat = 'HH:mm:ss'
const datetimeFormat = [dateFormat, timeFormat].join(' ')
const maxCount = 2
for (let i = 0; i < maxCount; i++) {
let s_ = s
let outputFormat
if (i === maxCount - 1) {
s_ = '1980/01/01 ' + s_
outputFormat = timeFormat
} else if (s_.indexOf(':') === -1) {
outputFormat = dateFormat
} else {
outputFormat = datetimeFormat
}
let t = dayjs(s_, datetimeFormat)
if (t.isValid()) {
const n = a.match(/[0-9]+/)[0]
switch (a.slice(0, 1)) {
case '+':
t = t.add(n, unit)
break
case '-':
t = t.subtract(n, unit)
break
default:
throw new Error('『日時加算』命令の引数Aは「(+|-)1(年|ヶ月|日|時間|分|秒)」のように指定します。')
}
return t.format(outputFormat)
}
}
throw new Error('日時を正常に加算できませんでした。')
}
}
}
export default PluginDateTime
// scriptタグで取り込んだ時、自動で登録する
/* istanbul ignore else */
if (typeof (navigator) === 'object' && typeof (navigator.nako3) === 'object') { navigator.nako3.addPluginObject('PluginDateTime', PluginDateTime) }