日付文字列をシリアル値に変換します。
- 構文
- Double = dateValue( str )
- 引数
- str 必須
- 日付文字列
- 戻り値
- シリアル値
プログラム
解説
- 2行目
- カットオフ年の終了年を指定します。西暦を2桁で指定したときcutOffYearで指定された年の値までの100年間で西暦を決めます。デフォルトでは2049年までの100年間(1950〜2049年の範囲)で年を決定します。例えば年を25と指定した場合は2025年、86と指定した場合は1986年として扱います。
- 3行目
- 英語月名を格納した配列。日付文字列として英語月名が指定されたときに数字に変換するときに使用します。
- 5行目
- 正規表現を格納する連想配列。
- 6行目
- 西暦を表す正規表現。1900〜9999年の範囲の値。
- 7行目
- 2桁の年を表す正規表現。00〜99の範囲の値。
- 8行目
- 元号を格納した連想配列。明治、大正、昭和、平成、令和、明、大、昭、平、令、M、T、S、H、Rにマッチします。
- 9行目
- 月を表す正規表現。1〜12の範囲の値。0埋めの有無に関係なくマッチします。
- 10行目
- 2桁の月を表す正規表現。01〜12の範囲の数値。
- 11行目
- 英語月名を表す正規表現。January〜December、短縮形のJan〜DecとSeptにマッチします。
- 12行目
- 日を表す正規表現。1〜31の範囲の値。0埋めの有無に関係なくマッチします。
- 13行目
- 2桁の日を表す正規表現。01〜31の範囲の数値。
- 14行目
- 英語の日付を表す序数表記。1st〜31stの範囲。
- 15行目
- 年月日を区切る文字を表す正規表現。例えば2024/10/24の/の部分。.、/、-にマッチします。
- 17-22行目
- 元号から西暦に変換するための値を格納する連想配列。8行目>>>でマッチする文字列に対応しています。例えば令和6年の場合、キー名が令和の値2018と6を足すことで西暦2024年と求められます。
- 24,129行目
- strで指定された日付形式にマッチする正規表現のCASE句を実行します。いずれのCASE句でも行っている処理はすべてマッチした日付文字列から年、月、日を取り出してyyyy/mm/ddの形式でdateに代入することです。
- 25-29行目
- yyyy/mm/dd、yyyy-mm-dd、yyyy.mm.ddもしくはyyyy/mm、yyyy-mm、yyyy.mmの形式の日付文字列にマッチします。\2は区切り文字を表していて年と月の区切り文字と月と日の区切り文字が同じ場合にマッチします。例えば2024/10/23にはマッチしますが、2024/10-23にはマッチしません。dateにはyyyy/mm/ddの形式に変換した日付文字列が代入されます。日が省略された場合はその年月の1日として扱い、例えば2024/10と指定した場合は2024/10/01として扱います。IIF関数 (自作関数)の箇所がその処理をしています。
- 30-34行目
- mm/dd/yyyy、mm-dd-yyyy、mm.dd.yyyyの形式の日付文字列にマッチします。dateにはyyyy/mm/ddの形式に変換した日付文字列が代入されます。
- 35-39行目
- dd/mm/yyyy、dd-mm-yyyy、dd.mm.yyyyの形式の日付文字列。dateにはyyyy/mm/ddの形式に変換した日付文字列が代入されます。
- 40-44行目
- ggge/mm/dd、ggge-mm-dd、ggge.mm.dd、gge/mm/dd、gge-mm-dd、gge.mm.dd、ge/mm/dd、ge-mm-dd、ge.mm.ddの形式の日付文字列にマッチします。
- 45-50行目
- 2桁年/月/日、2桁年-月-日、2桁年.月.日の形式の日付文字列。yにはマッチした2桁年を代入し計算に使うためVAL関数 (スクリプト関数)で数値に変換します。2行目>>>で指定されたカットオフ年の範囲に収まるような4桁年を求めます。dateには年/月/日の形式に変換した日付文字列が代入されます。
- 51-56行目
- 月/日/2桁年、月-日-2桁年、月.日.2桁年の形式の日付文字列。年月日の順序が違うだけで処理は38行目>>>と同じです。
- 57-62行目
- 日/月/2桁年、日-月-2桁年、日.月.2桁年の形式の日付文字列。処理は38行目>>>と同じです。
- 63-67行目
- アメリカ式の月 日, 年の形式の日付文字列。
- 68-72行目
- イギリス式の日 月 年の形式の日付文字列。
- 73-77行目
- 和暦年月日、和暦年月の形式の日付文字列。
- 78-82行目
- 年月日、年月の形式の日付文字列。
- 83-87行目
- 月日の形式の日付文字列。
- 88-93行目
- 年月日を6桁で表した形式の日付文字列。
- 94-99行目
- 月日年を6桁で表した形式の日付文字列。
- 100-105行目
- 日月年を6桁で表した形式の日付文字列。
- 106-110行目
- 年月日の形式の日付文字列。
- 111-115行目
- 月日年の形式の日付文字列。
- 116-120行目
- 日月年の形式の日付文字列。
- 121-123行目
- いずれの日付文字列の形式にもマッチしなかった場合はERR_VALUEを返します。
- 125行目
- 日付文字列dateをuwscToSerial関数 (自作関数)でシリアル値に変換した値を戻り値として返します。
日付文字列の形式
以下はdateValue関数で使える日付書式指定子です。
| 日付書式 |
意味 |
|---|---|
| yyyy | 年 |
| yy | 西暦の下2桁 |
| mm | 月 |
| mmm | 英語月(Jan, Feb, Mar, …) |
| mmmm | 英語月(January, February, March, …) |
| dd | 日 |
| g | 元号をアルファベットで表記
M、 T、 S、 H、 R |
| gg | 元号を漢字の頭文字で表記
明、 大、 昭、 平、 令 |
| ggg | 元号を漢字で表記
明治、 大正、 昭和、 平成、 令和 |
| e | 元号の年。令和6年ならば 6。 |
以下はdateValue関数でシリアル値に変換することができる日付文字列の形式です。普段使わない形式もありますが、プログラムが複雑になるのでとりあえず日付と認識できるものとして記載しています。
年を省略した日付文字列を指定した場合は今年、月を省略した場合はその月の月初日(1日)として扱われます。
dateValue関数は日付文字列をシリアル値に変換する関数なので時刻が含まれる場合、時刻部分は無視(0時扱い)となります。
以下の例は2024年に実行したときの結果です。
| 日付文字列のパターン | 例 |
|---|---|
| yyyy/mm/dd | 1990/04/01 |
| yyyy-mm-dd | 1990-04-01 |
| yyyy.mm.dd | 1990.04.01 |
| yyyy/mm | 1990/04 |
| yyyy-mm | 1990-04 |
| yyyy.mm | 1990.04 |
| mm/dd/yyyy | 04/01/1990 |
| mm-dd-yyyy | 04-01-1990 |
| mm.dd.yyyy | 04.01.1990 |
| dd/mm/yyyy | 01/04/1990 |
| dd-mm-yyyy | 01-04-1990 |
| dd.mm.yyyy | 01.04.1990 |
| ggge/mm/dd | 平成02/04/01 |
| gge/mm/dd | 平02/04/01 |
| ge/mm/dd | H02/04/01 |
| ggge-mm-dd | 平成02-04-01 |
| gge-mm-dd | 平02-04-01 |
| ge-mm-dd | H02-04-01 |
| ggge.mm.dd | 平成02.04.01 |
| gge.mm.dd | 平02.04.01 |
| ge.mm.dd | H02.04.01 |
| ggge/mm | 平成02/04 |
| gge/mm | 平02/04 |
| ge/mm | H02/04 |
| ggge-mm | 平成02-04 |
| gge-mm | 平02-04 |
| ge-mm | H02-04 |
| ggge.mm | 平成02.04 |
| gge.mm | 平02.04 |
| ge.mm | H02.04 |
| yy/mm/dd | 90/04/01 |
| yy-mm-dd | 90-04-01 |
| yy.mm.dd | 90.04.01 |
| mm/dd/yy | 04/01/90 |
| mm-dd-yy | 04-01-90 |
| mm.dd.yy | 04.01.90 |
| dd/mm/yy | 01/04/90 |
| dd-mm-yy | 01-04-90 |
| dd.mm.yy | 01.04.90 |
| mm/dd | 04/01 |
| mm-dd | 04-01 |
| mm.dd | 04.01 |
| mmmm d"st", yyyy mmmm d"nd", yyyy mmmm d"rd", yyyy mmmm d"th", yyyy | April 1st, 1990 |
| mmmm d"st",yyyy mmmm d"nd",yyyy mmmm d"rd",yyyy mmmm d"th",yyyy | April 1st,1990 |
| d"st" mmmm yyyy d"nd" mmmm yyyy d"rd" mmmm yyyy d"th" mmmm yyyy | 1st April 1990 |
| ggge年mm月dd日 | 平成02年04月01日 |
| gge年mm月dd日 | 平02年04月01日 |
| ge年mm月dd日 | H02年04月01日 |
| ggge年mm月 | 平成02年04月 |
| gge年mm月 | 平02年04月 |
| ge年mm月 | H02年04月 |
| yyyy年mm月dd日 | 1990年04月01日 |
| yyyy年mm月 | 1990年04月 |
| mm月dd日 | 04月01日 |
| yymmdd | 900401 |
| mmddyy | 040190 |
| ddmmyy | 010490 |
| yyyymmdd | 19900401 |
| mmddyyyy | 04011990 |
| ddmmyyyy | 01041990 |
日付文字列は区切り文字を無視した場合年月日、月日年、日月年の順番でマッチ検索を行い最初にマッチした形式で認識します。例えば01/02/2024という日付文字列の場合は年/月/日、月/日/年、日/月/年の順番でマッチ検索を行っていきます。最初にマッチするのは月/日/年の形式なので01/02/2024は2024年01月02日として扱われます。
次に14/02/2024という日付文字列の場合、月/日/年という形式だと2024年14月02日と存在しない日付となるので日/月/年の形式にマッチし2024年02月14日として扱われます。
使い方
年月日の形式からシリアル値を求める
2024年10月28日のシリアル値を求めます。
- 結果
年が省略された日付文字列のシリアル値
年が省略されている場合は今年として扱います。
- 結果
日が省略された日付文字列のシリアル値
日が省略されている場合は指定年月の月初(1日)として扱います。
以下は2024年10月01日として扱われます。
- 結果
今日のシリアル値
today関数 (自作関数)で取得した今日の日付文字列からシリアル値を求めます。
- 結果
他の日付形式に変換
違う形式に変換する場合はtext関数 (自作関数)を使います。
以下は2024年10月28日をシリアル値に変換してからtext関数 (自作関数)でggge年mm月dd日の形式に変換しています。
- 結果
終了日を過ぎた和暦表記の日付文字列を対応する元号に変換
以下は昭和100年1月1日を対応する元号の日付文字列に変換します。
- 結果
色々な形式の日付文字列の変換
dateValue関数で変換できる日付文字列の形式を一通り実行しています。
- 結果
プログラム実行例
写真の撮影日時毎に枚数を取得
選択したフォルダにある写真の撮影日時を取得・カウントします。
Windowsの稼働時間を取得
Windowsシステムの起動時間から稼働時間を求めます。
結果はd:hh:nn:ssの形式で出力されます。
日付が指定した範囲内にあるか
今日の日付が2022/04/01〜2022/04/05の範囲内にあるか。
日付をシリアル値に変換し、2022/04/01以降かつ2022/04/05以前かを調べる。
フォルダ内のファイルを更新日時でソートする
写真を撮影日時毎にフォルダ分けする
参考文献
公開日:
更新日:
関連記事
- now関数 (自作関数)
- 現在の日時のシリアル値を返します。
- dateSerial関数 (自作関数)
- 引数に指定した年、月、日の日付が表すシリアル値を返します。
- getSerialTime関数 (自作関数)
- UWSC時間からシリアル値を取得します。
- uwscToSerial関数 (自作関数)
- UWSC時間をシリアル値に変換します。
- serialToUwsc関数 (自作関数)
- シリアル値をUWSC時間に変換します。
- serialToUNIX関数 (自作関数)
- シリアル値をUNIX時間に変換します。
- UNIXToSerial関数 (自作関数)
- UNIX時間 をシリアル値に変換します。
- Hour関数 (自作関数)
- シリアル値で与えられた時刻から時間を求めます。戻り値は0〜23の範囲の整数となります。
- Second関数 (自作関数)
- シリアル値から秒を求めます。
- timeValue関数 (自作関数)
- 指定した時間のシリアル値を求める。
