JavaScriptで「今日で婚約してから何日か」を計算するプログラムを作る

お世話になります。林です。

ここでは「婚約したのに結婚の話が出なくなった」というありがちな事例に際して、「今日で婚約してから何日か」を計算するプログラムを作ることで対処します。JavaScriptにおける時間計算のデフォルト設定や、それを一般的な時間に引き直す時にどうするか、さらに角が立たないように結婚したいと伝えるにはどうすればいいか解説します。

婚約してから今日この瞬間までの差をどう求めるか

まず、「今日が婚約してから何日目か」を計算するためには、

  1. 婚約した日の日付
  2. 今日この瞬間の日付

の二点が必要になります。

1.については、

var date1 = new Date(2018, 5, 21);

という形で婚約記念日をそのまま書けば良いでしょう。date1という変数を宣言(var)して、日付を入れるという簡単な作業です。

2.については、

var date2 = new Date(2018 ,8, 23);

という形で都度入力しましょう。「new Date();」で実行すると、今この瞬間の日付が入る形になり便利なのですが、考えてみたらJavaScriptだと月が0-11で1ヶ月ずれるので、それを直すのが面倒です。

ミリ秒から日単位へと換算する方法

その上で、婚約した日から○日目かを計算するためには、今日の日付から婚約記念日を引けば良いので、

var diff = (date2.getTime() - date1.getTime());

とすれば良いように思えます。

console.log(diff + '日目の婚約記念日です。');

ちゃんと表示されないといけないので、○日目の婚約記念日です、と出てくるように記録(log)する(console)ことを忘れないようにしましょう。

さっそく、

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>【思い出すシリーズ】婚約記念日</title>
</head>
<body>
<script>
var date1 = new Date(2018, 5, 21);
var date2 = new Date();
var diff = (date2.getTime() - date1.getTime());
console.log(diff + '日目の婚約記念日です。');
</script>
</body>
</html>

みたいなかんじで実行してみましょう。

あれ、うまくいかないですね。なぜでしょうか。

実は、new Date();は、年月日時分秒ミリ秒まで取得する概念なので、最小単位はミリ秒です。ですから、ミリ秒単位での話がここには出力されてしまいます。この表示は本来であれば、婚約記念日から3148323220ミリ秒が経過したというのが正しい出力結果なのですが、そんなこと言われたから一瞬で婚約破棄されるのでだめです。どうにかまともな日数に変える方法を考えましょう。

まず、ソースコードについては、

var diff = (date2.getTime() - date1.getTime()) / (1000 * 60 * 60 * 24);

と変える必要があります。ミリ秒というのは秒の1/1000なので、秒表示にするために1/1000をやり、分表示にするために1/60をやり、時間表示にするために1/60をやり、日表示にするために1/24をやります。そしてこれらをすべてかけると、日表示になります。

その上で実行すると、

こうなります。少なくとも婚約した日から36日目だということは分かりましたが、これでもまだ角が立ちますね。婚約破棄されそうです。あと、この記事を最初に書いてるのが7/27なんですが、5/21から36日目ということもなさそうです。

なんかこれで実装すると1ヶ月分ずれる

私も、書いた後に指摘をいただいて気づいたのですが、Javascriptは月だけに関しては0-11で計算するので、それでずれてしまったようです。5/21〜7/27なので、正しくは下記のようにしないと、多分正しい結果が出力されません。とりあえず1ヶ月分加算するために、もともとの日付の月の部分から1引きます。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>【思い出すシリーズ】婚約記念日</title>
</head>
<body>
<script>
var date1 = new Date(2018, (5-1), 21);
var date2 = new Date();
var diff = (date2.getTime() - date1.getTime()) / (1000 * 60 * 60 * 24);
console.log(Math.floor(diff) + '日目の婚約記念日です。');
</script>
</body>
</html>

小数点を出すと角が立つので切り捨て処理を行う

どうして角が立つのかを分析すると、小数点だから角が立つというのはあります。そこで切り捨て型で小数点が出ないように数字を丸めてみましょう。

以前紹介したように、数字を切り捨てるときは、Math.floorメゾットを使うので、

console.log(Math.floor(diff) + '日目の婚約記念日です。');

こんな形になります。8/13の段階で実行してみると、

こんなかんじでようやくまともな(期間も正しい)整数の婚約記念日からの日数が出てきました。今冷静になってみてみると、○○日目の婚約記念日って文言がいやみったらしいですね。

男は信用できないがエンジニアの腕とお金は信用できる

いずれにせよ、私の乏しい男女経験から言っても、婚約した後に一度気持ちが冷めたら、その後結婚するのはなかなか難しいものなのではないかなと思います。男も信用できないものですし、女も同じぐらい信用できないものです。しかし、自分自身が努力して身につけたエンジニアの腕とお金は信用できます。ですから、婚約したにしてもしないにしても、プログラミングがんばりましょう。(今日のまとめ)

プログラミング・ネットビジネスのご相談はこちらから

「ネットビジネスがうまくいかない……」という方は、こちらからご相談ください。
(記事執筆者が相談対応させていただきます!)