はじめに
「今日の日付でフォルダを作る」「ファイル名の末尾に今日の日付をつける」など、日付に関する操作はRPAではよく出てきます。
その際、ツールによっては「日付を文字列に変換する」といった操作が必要になります。
うんうん、そうだよね! と、すぐに理解できる場合はいいのですが、プログラミング経験などがないままRPAを始めた人にとっては、
「ん・・・? 日付? 文字列? 変換???」
と、頭にたくさん「?」が浮かぶかもしれません。
そもそも「文字列」という言葉自体、プログラミング未経験者には聞きなれない言葉でしょうし、なぜ日付を文字列に変換する必要があるのかもピンと来ないかもしれません。
そんな疑問を解決するために、この記事を書きました。
こんな経験ありませんか?
Excelなどを触っていて、こんな経験をしたことはないでしょうか。
例えばこんなふうに、もともと日付が入っていたはずのファイルが……
何かの拍子に、日付の部分が意味のわからない数字に変わってしまっていた! というようなことです。
もし経験がない人は、どこかのセルに適当な日付を入れた上で、そのセルの書式を「標準」に変更してみてください。
すると、こんなかんじの数字に変わると思います。(どんな数字になるかは日付によって違います)
変な数字=日付のシリアル値
「44274」「44275」などの数字はデタラメな数字に見えるかもしれませんが、そうではありません。
実際は、「3月19日」「3月20日」というふうに表示されているセルでも、Excelが内部的に持っている値の中身は「44274」や「44275」なのです。
Excelが内部的に持つ、日付を数字に変換した値を、「シリアル値」といいます。
シリアル値は、「1900年1月1日を1としたとき、そこから何日経過しているか」を表す数字になっています。
どうしてExcelは日付をシリアル値で持っているの?
どうしてExcelは、日付をシリアル値で持つ必要があるのでしょうか?
理由は大きく分けて2つです。
- 計算が楽だから
- 「2021年3月19日」と「2020/3/19」のように、書式の違う日付を同じ日付と認識するため
1.計算が楽だから
数字同士の足し算と比べて、日付の計算は少し複雑です。
たとえば25+7は、数字同士の足し算であれば常に32と決まっています。
ところが日付の場合は、月によって答えが変わります。
1,3,5,7,8,10,12月の25日の7日後は翌月の1日になり、12月の場合は年も変わります。
4,6,9,11月の25日の7日後は翌月の2日です。
2月の場合は、うるう年かどうかによって、3月4日になるか、3月3日になるかが変わります。
コンピュータは、単純計算はとても早くできるのですが、実は複雑な計算が苦手です。
「12月25日の7日後? えーっと、12月は31日あるから、7日後は翌月の1日になって、12月ということは年も変わるから……」みたいなことを考えるのは、実はコンピュータはとても苦手なのです。
それよりは、
・2020年12月25日のシリアル値は44190
・44190+7=44197
・44197のシリアル値を日付に変換して、2021年1月1日を求める
とする方が、コンピューターにとってはシンプルで計算が楽なのです。
2. 「2021年3月19日」と「2020/3/19」のように、書式の違う日付を同じ日付と認識するため
私たち人間にとって、「2021年3月19日」と「2020/3/19」はいずれも日付であり、同じ日付だと理解するのは簡単です。
でも、コンピューターにとってはそうではありません。
「2021年3月19日」と「2020/3/19」は、文字として比べれば同じではないからです。
ですが、人間としては日付をどちらの書き方で書こうが、「令和3年3月19日」と書こうが、やはりそれらは同じ数字として認識して、Excelにもちゃんと計算をさせたりしたいですよね。
日付をシリアル値で表現することで、それが可能になります。
・2021年3月19日という日付の値を表すのは、シリアル値の「44274」
・シリアル値の「44274」を「2021年3月19日」「2020/3/19」「令和3年3月19日」などのどんな形式で表現するかは、書式で決める
というわけですね。
#プログラミングやRPAの世界でも、考え方は同じ
ここまで、みなさんになじみ深いであろうExcelを例に話をしてきましたが、プログラミングやRPAの世界でも、基本的な考え方は同じです。
まとめると、こういうことです。
- 日付をシリアル値で表現する
- 何日前・何日後といった計算は、シリアル値を足し引きすることで行う
- シリアル値を人間に理解しやすい日付にするために、書式を設定する
プログラミングやRPAの場合、ここに「型」という考え方が加わるのがつまずきのポイントかもしれません。
型 = データを入れる入れ物の形
型については以下の記事で詳述していますが、非常にざっくり言えば、データを入れるための入れ物(=変数)の『形』のことです。
たとえで説明すると
例えば、ペットボトルがあれば、中身は見なくてもたぶん液体だろうと予想がつきますよね。
また、お重があれば、「うな重かちらし寿司かおせちかな」などと予想ができます。
中身が予想できることで、その入れ物を「どう扱えばいいか」が中身を見なくてもわかります。
ペットボトルであれば、ふたがしっかり閉まっていれば逆さにして持ち運んでも大丈夫ですが、ふたをあけるときは上向きにして開けないと中身がこぼれてしまいます。
お重であれば、持ち運ぶときもふたを開けるときもひっくり返してはいけないですし、傾けたり横向きにするのもダメです。
そして、ペットボトルに比べると、早く消費した方がいいです。
などなど、入れ物の「形」によって、私たちはそれを「どう扱うべきかのルール」を判断しているわけです。
RPAやプログラミングの「型」も同じこと
RPAやプログラミングに登場する「型」も、考え方は同じです。
例えば「数字」の型であれば、足し算や引き算や割り算などの四則演算や、大きさの比較をするんだろうな、とわかります。
日付であれば、「何日後」「何日前」などの前後の計算をする(足し算、引き算)はありますが、割り算や掛け算はありません。
メッセージを表示したり、ファイル名を表現したりする場合には、文字列の型を使います。
日付の話に戻ると
たとえ話はこのくらいにして、日付の話に戻ります。
復習になりますが、コンピューターでは日付を以下のような形で扱うのでした。
- 日付をシリアル値で表現する
- 何日前・何日後といった計算は、シリアル値を足し引きすることで行う
- シリアル値を人間に理解しやすい日付にするために、書式を設定する
上記の3つのうち、1と2のような計算は日付型の入れ物に入っていないとできません。
逆に、3で書式を設定した結果は、文字列型の入れ物に入れます。
ふだんは日付型の入れ物に入れておくことで計算をしやすくし、人間が読める形に表示するときだけ、書式を設定して文字列型にする。
それが「日付を文字列に変換する」ということです。
以上!
日付の文字列変換について、少しでも理解が深まったでしょうか?
わからない点や、「他にもこんな記事を書いてほしい!」などのリクエストがあれば、この記事にコメントをいただくか、Twitterなどでからんでいただければ極力おこたえします。
では!