多くのPCは、協定世界時 (UTC) での1970年1月1日 午前0時0分0秒を起点として時刻を管理しています。
なぜかこの時刻?と思って調べると『(UNIX時間の)取り決めをした時に、PCの時刻管理のデータ容量を考慮すると当分持つし、キリが良いから』だそうです。
その当分持つというのが、2038年1月19日3時14分7秒(UTC)までで、これを過ぎると一部のPCで、時間がおかしくなってしまう2038年問題というのがあるそうです。
◯◯年問題ってのがいろいろありますが、その1つです。
MMR マガジンミステリー調査班的にいうと、人類滅亡するかもしません。
という話はさておき、今回はJavaScriptで経過日数を計算する方法です。
目次
使用環境
私が使用している環境です。
- Mac OS X El Capitan Version 10.11.4
- Cocos Creator Version 1.0.1
- ブラウザ:Google Chrome Version 50.0.2661.86 (64-bit)
経過日数の計算
経過日数を計算する例です。
今世紀に入ってからの経過日数を計算しています。
それぞれ午前0:00分時点での比較を行います。
var today = new Date(); // 現在の日時を取得 cc.log(today.toString()); // 『Fri Apr 29 2016 20:28:27 GMT+0900 (JST)』と出力される today = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0); // 時刻を0:00にする cc.log(today.toString()); // 『Fri Apr 29 2016 00:00:00 GMT+0900 (JST)』と出力される var dateStart = new Date("2000/12/31"); // 比較する日付のDateオブジェクトを取得 cc.log(dateStart.toString()); // 『Sun Dec 31 2000 00:00:00 GMT+0900 (JST)』と出力される var msecDiff = today.getTime() - dateStart.getTime(); // ミリ秒で計算 cc.log(msecDiff.toString()); // 『483667200000』と出力される var dayDiff = Math.floor(msecDiff / 1000 / 60 / 60 / 24); // ミリ秒を日数に変換し、小数点以下切り捨て cc.log(dayDiff.toString()); // 『5598』と出力される
うるう年が処理されているか気になりますが、
このサイトで計算しても5598日になったのであってるようです。(人任せです。)
日数計算(日付−日付) - 高精度計算サイト
new Date()の引数
Date()は下記のような引数を取ります。
new Date()
戻り値 | 現在の日時 |
new Date(dateString)
dateString | 日付を表す文字列。 parse メソッドで認識可能な形式であること。 |
|
戻り値 | 文字列で指定された日時 |
new Date(year, month[, day, hour, minute, second, millisecond])
year | 年数。西暦4桁が望ましい。 | |
month | 月。0が1月で、11が12月なので注意。 | |
day | 日。1〜31。日付は1始まり。 | |
hour | 時。0〜23 | |
minute | 分。0〜59 | |
second | 秒。0〜59 | |
millisecond | ミリ秒。0〜999 | |
戻り値 | 引数で指定された日時 |
monthだけ嫌がらせだろうか。。。
年の取得は、getFullYear()
年だけ『Full』が付いています。
getYear() は 1900 年からの経過年数を返すそうです。
getFullYear()は、西暦の年数を返します。
getTime() はミリ秒を返す
『getTime() 』は、1970年1月1日午前0時0分0秒(UNIXエポック)からの経過時間をミリ秒で返します。
参考サイト
下記のサイトが参考になりました。
Date()を使う時は注意が必要ですね。
あとがき
JavaScriptでは、日数を計算はミリ秒で差を取ってから日に換算するんですね。
調べたサイトではどこもこのやり方でした。
あと、『msecDiff / 1000 / 60 / 60 / 24』は、ちゃんと前から順に割り算されるんですが、なんか不安を感じます。