本ページには広告が含まれています。
指定年月のn回目のw曜日(第nW曜日)の日付を返します。年・月どちらかでも省略されたら当月として計算。
- 構文
- getNthWeekday( n, w, year, month )
- 引数
- n 必須
- 月何週目かを数値で指定。マイナス値で後ろから。
- w 必須
- 0:日曜~6:土曜で数値を指定
- year 省略可
- 年
- month 省略可
- 月
- 戻り値
- 指定年月の第n週w曜日の日付を返します。
プログラム
//////////////////////////////////////////////////
// 【引数】
// n : 月何週目かを数値で指定。マイナス値で後ろから。
// w : 0:日曜~6:土曜で数値を指定
// year : 年
// month : 月
// 【戻り値】
//
//////////////////////////////////////////////////
FUNCTION getNthWeekday(n, w, year = EMPTY, month = EMPTY)
IFB year = EMPTY OR month = EMPTY THEN
date = EMPTY
ELSE
date = year + "/" + IIF(LENGTH(month) = 1, "0", "") + month + "/01"
ENDIF
GETTIME(0, date)
DIM yyyy = G_TIME_YY
DIM mm = G_TIME_MM
IFB w < 0 OR w > 7 THEN
RESULT = ERR_VALUE
EXIT
ENDIF
IFB n > 0 THEN
GETTIME(0, date)
d = 1 - G_TIME_DD
GETTIME(d, date)
w = w - G_TIME_WW
d = d + w + ((w < 0) + n - 1) * 7
GETTIME(d, date)
ELSEIF n < 0 THEN
date = getEndOfMonth(date)
DIM serial = uwscToSerial(GETTIME(0, date))
serial = INT((serial + (6 - w)) / 7) * 7 - (6 - w) - 7 * (n + 1)
DIM uwscTime = serialToUwsc(serial)
GETTIME(uwscTime / 86400, "20000101000000")
ENDIF
RESULT = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2
FEND
//////////////////////////////////////////////////
// 【引数】
// interval : 加算する時間間隔を表す文字列式(yyyy:年、m:月、d:日、ww:週、h:時、n:分、s:秒)
// num : dateに加算する値。未来は正、過去は負で指定
// date : 時間間隔を加算する日付
// 【戻り値】
//
//////////////////////////////////////////////////
FUNCTION dateAdd(interval, num, date)
DIM year, month, day, d
GETTIME(0, date)
DIM time = G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2
SELECT interval
CASE "yyyy"
d = (G_TIME_YY + num) + "/" + G_TIME_MM2 + "/" + G_TIME_DD2
IF time <> "00:00:00" THEN d = d + " " + time
CASE "m"
IFB num > 0 THEN
year = G_TIME_YY + INT((G_TIME_MM + num) / 12)
month = REPLACE(FORMAT(((G_TIME_MM + num) MOD 12), 2), " ", "0")
ELSE
year = G_TIME_YY + CEIL((G_TIME_MM + num) / 12 - 1)
month = REPLACE(FORMAT(G_TIME_MM - (ABS(num) MOD 12), 2), " ", "0")
ENDIF
IF month = "00" THEN month = 12
day = G_TIME_DD2
d = "" + year + month + day
IFB !isDate(d) THEN
d = year + "/" + month + "/" + "01"
d = getEndOfMonth(d)
ELSE
d = year + "/" + month + "/" + day
ENDIF
IF time <> "00:00:00" THEN d = d + " " + time
CASE "d"
t = GETTIME(num, date)
d = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + IIF(t MOD 86400, " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2, "")
CASE "ww"
t = GETTIME(num * 7, date)
d = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + IIF(t MOD 86400, " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2, "")
CASE "h"
t = GETTIME(num / 24, date)
d = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + IIF(t MOD 86400, " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2, "")
CASE "n"
t = GETTIME(num / 1440, date)
d = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + IIF(t MOD 86400, " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2, "")
CASE "s"
t = GETTIME(num / 86400, date)
d = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2 + IIF(t MOD 86400, " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2, "")
SELEND
RESULT = d
FEND
//////////////////////////////////////////////////
// 【引数】
// date : 日付(”YYYYMMDD” or “YYYY/MM/DD” or “YYYY-MM-DD” or “YYYYMMDDHHNNSS” or “YYYY/MM/DD HH:NN:SS”)
// m : 第一引数の指定日からプラスマイナスm月とする
// 【戻り値】
//
//////////////////////////////////////////////////
FUNCTION getEndOfMonth(date, m = 0)
date = dateAdd("m", m + 1, date)
GETTIME(0, date)
GETTIME(-G_TIME_DD, date)
RESULT = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2
FEND
//////////////////////////////////////////////////
// 【引数】
// expr : 評価する式
// truepart : 評価した式がTrueのときに返す値
// falsepart : 評価した式がFalseのときに返す値
// 【戻り値】
//
//////////////////////////////////////////////////
FUNCTION IIF(expr, truepart, falsepart)
IFB EVAL(expr) THEN
RESULT = truepart
ELSE
RESULT = falsepart
ENDIF
FEND
//////////////////////////////////////////////////
// 【引数】
// date : 存在するかを調べる日付文字列。YYYYMMDD or YYYY/MM/DD or YYYY-MM-DDのいずれかの形式。
// 【戻り値】
//
//////////////////////////////////////////////////
FUNCTION isDate(date)
TRY
GETTIME(0, date)
RESULT = TRUE
EXCEPT
RESULT = FALSE
ENDTRY
FEND
//////////////////////////////////////////////////
// 【引数】
// serialTime : シリアル値
// 【戻り値】
//
//////////////////////////////////////////////////
FUNCTION serialToUwsc(serialDate)
RESULT = GETTIME(serialDate, "18991230000000")
FEND
//////////////////////////////////////////////////
// 【引数】
// uwscTime : UWSC時間
// 【戻り値】
//
//////////////////////////////////////////////////
FUNCTION uwscToSerial(uwscTime)
uwscDate = uwscTime / 86400
RESULT = 36526 + uwscDate
FEND
使い方
第1月曜日(w=1)
PRINT getNthWeekday(1, 1)
第3金曜日(w=5)
PRINT getNthWeekday(3, 5)
成人の日(1月の第2月曜日)
PRINT getNthWeekday(2, 1, getYear(today()), 1)
海の日(7月の第3月曜日)
PRINT getNthWeekday(3, 1, getYear(today()), 7)
敬老の日(9月の第3月曜日)
PRINT getNthWeekday(3, 1, getYear(today()), 9)
スポーツの日(10月の第2月曜日)
PRINT getNthWeekday(2, 1, getYear(today()), 10)
プレミアムフライデー(毎月最終金曜日)
PRINT getNthWeekday(-1, 5)
ブラックフライデー(11月の第4木曜日の翌日)
PRINT dateAdd("d", 1, getNthWeekday(4, 4, getYear(today()), 11))
関連記事
- getWeekdayName関数 (自作関数)
- getWeekdayName関数は、指定した曜日番号に対応する曜日名を返します。第一引数に曜日番号、第二引数にフォーマットを指定します。
- getWeekday関数 (自作関数)
- 引数に指定された日付の曜日番号(0:日曜〜6:土曜)を返します。
- GETTIME関数 (スクリプト関数)
- GETTIMEは日時を取得する関数です。第二引数に指定された基準日から第一引数に指定した日数を加算した値を返します。戻値は2000年1月1日からの秒数です。関数実行後特殊変数に値がセットされ、その特殊変数から日付情報を取得できます。
- getYear関数 (自作関数)
- 指定した日付から「年」を返します。
- getMonth関数 (自作関数)
- 指定した日付から「月」を返します。
- getDay関数 (自作関数)
- 指定した日付から「日」を返します。
- isDate関数 (自作関数)
- isDate関数は、引数が有効な日付として認識できる場合はTrue、それ以外の場合はFalseを返します。
- getEndOfMonth関数 (自作関数)
- getEndOfMonth関数は、date から m 月後の月末の日付を返す関数です。m は正の値で未来、負の値で過去になります。
- today関数 (自作関数)
- today関数は、現在の日付を返す関数です。YYYY/MM/DD形式で返されます。時刻も含めて取得する場合はnow関数を使います。
- now関数 (自作関数)
- now関数は、現在の日時を取得する関数です。日付のみ取得したい場合は、today関数を使います。