モーリーのメモ

アプリ開発等(プログラミング、CG作成)、興味を持ったことを実践してまとめるブログです。

モーリーのメモ

経過日数の計算:JavaScript

 多くのPCは、協定世界時 (UTC) での1970年1月1日 午前0時0分0秒を起点として時刻を管理しています。
 なぜかこの時刻?と思って調べると『(UNIX時間の)取り決めをした時に、PCの時刻管理のデータ容量を考慮すると当分持つし、キリが良いから』だそうです。
 その当分持つというのが、2038年1月19日3時14分7秒(UTC)までで、これを過ぎると一部のPCで、時間がおかしくなってしまう2038年問題というのがあるそうです。
 ◯◯年問題ってのがいろいろありますが、その1つです。
 MMR マガジンミステリー調査班的にいうと、人類滅亡するかもしません。
 
 という話はさておき、今回はJavaScriptで経過日数を計算する方法です。

使用環境

 私が使用している環境です。

経過日数の計算

 経過日数を計算する例です。
 今世紀に入ってからの経過日数を計算しています。
 それぞれ午前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日になったのであってるようです。(人任せです。)
日数計算(日付−日付) - 高精度計算サイト
f:id:mmorley:20160429210518p:plain

new Date()の引数

 Date()は下記のような引数を取ります。

new Date()

戻り値 現在の日時

new Date(value)

value 1970年1月1日午前0時0分0秒(UNIXエポック)からの
経過時間(ミリ秒)
 
戻り値 計算された日時  

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』は、ちゃんと前から順に割り算されるんですが、なんか不安を感じます。