例えば、よくファイルの作成日や更新日にタイムスタンプを用いることがありますが、ただの数字の羅列のままでは日付と比較できないので、JavaScriptで日付形式に変換し、前日の日付と比較して一致するか判定する方法をご紹介します。
タイムスタンプとは?
予備知識として、タイムスタンプについてちょいと解説。
タイムスタンプを簡単に言うと、[1970年1月1日00:00:00(UTC)]から経過秒数のことです。
UNIX時間 | 協定世界時 (UTC) | 日本標準時 (JST) |
---|---|---|
0 | 1970-01-01T00:00:00 | 1970-01-01T09:00:00 |
100000000 | 1973-03-03T09:46:40 | 1973-03-03T18:46:40 |
1000000000 | 2001-09-09T01:46:40 | 2001-09-09T10:46:40 |
1234567890 | 2009-02-13T23:31:30 | 2009-02-14T08:31:30 |
2147483647 | 2038-01-19T03:14:07 | 2038-01-19T12:14:07 |
今現在の日付をタイムスタンプに変換すると、10桁(または13桁)の数字で表します。
この10桁の数字をJavaScriptで日付形式に変換して比較していきます。
タイムスタンプと前日の日付を比較
ここでは、最終的にタイムスタンプと前日の日付が一致するかを判定する関数を作ります。
以下のようなJavaScriptの関数を用意し、引数[value]にはタイムスタンプを渡します。
1 2 3 |
function isYesterday(value) { ・・・ } |
タイムスタンプを日付に変換
タイムスタンプから日付への変換は、JavaScriptでお馴染みのDate()オブジェクトで既に用意されており、簡単に変換できると思っていましたが、これが少し曲者でした。
試しに、上記の表にあった10桁の数字(1234567890)を突っ込んで見たのですが、思ったような結果が返ってこない。。
1 2 |
var valDate = new Date(value); //1234567890 alert(valDate); |
本来なら、出力結果の日付は上記のように[2009年2月13日]と表示されるはずだが、実際出力されたのはコレでした。。
1 |
Thu Jan 15 1970 15:56:07 GMT+0900 (日本標準時) |
1970年!?
あまりにも差があるぞ!
桁が足りないのかな…?
ミリ秒を忘れるなかれ
そーなんです!
上記でも少し触れましたが、JavaScriptのDate()オブジェクトではタイムスタンプのミリ秒まで含めて計算するのです。
つまり、秒数の10桁にはミリ秒の3桁が含まれていないので、合計13桁の数字が必要になります。
では、どうするか。ミリ秒はどうでもいいので、単純に1,000を掛けるだけでいいじゃん!
ということで、もし10桁のタイムスタンプを使用する場合はこのようにしましょう。
1 2 |
var valDate = new Date(value * 1000); //1234567890 alert(valDate); |
これで想定通りの結果が返ってきました!
1 |
Sat Feb 14 2009 08:31:30 GMT+0900 (日本標準時) |
これでタイムスタンプ側の日付が取得できました!
前日の日付を取得する
次は比較する側、つまり、前日の日付を取得します。
こちらは特に説明が必要ないくらい簡単で、単純に現在の日付から1日を引くだけで良いです。
1 2 |
var objDate = new Date(); objDate.setDate(objDate.getDate() - 1); |
このDate()オブジェクトについては、前日以外にも先月や昨年、明日や来月などの取得もできるので、様々なシーンで使えると思います。
日付のフォーマットを合わせる
両方の日付を比較しやすいように、[YYYYMMDD]形式にフォーマットしてあげます。
先程、Date()オブジェクトで取得したタイムスタンプと前日の日付を同じ形式にフォーマットします。
ここで重要な点が2つあります。
- 月と日を2桁に揃える
slice()メソッドを使用して、月と日を2桁のゼロパディングする。 - 月は0から始まる
getMonth()メソッドは1月が[0]~12月を[11]と返すので注意!
上記のポイントを踏まえてコードを書くと、以下のようになります。
1 2 |
var valYMD = valDate.getFullYear() + ('0' + (valDate.getMonth() + 1)).slice(-2) + ('0' + valDate.getDate()).slice(-2); var objYMD = objDate.getFullYear() + ('0' + (objDate.getMonth() + 1)).slice(-2) + ('0' + objDate.getDate()).slice(-2); |
後は、この2つの日付が一致するか比較したら完成です。
関数の完成
完成した関数では、タイムスタンプと前日の日付を比較し、一致したら[1]、一致しなければ[0]を返します。
既に桁数は合わせてますので、比較は文字列でも数値でもif文で判定できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function isYesterday(value) { var result = 0 var valDate = new Date(value * 1000); var objDate = new Date(); var valYMD = valDate.getFullYear() + ('0' + (valDate.getMonth() + 1)).slice(-2) + ('0' + valDate.getDate()).slice(-2); var objYMD = objDate.getFullYear() + ('0' + (objDate.getMonth() + 1)).slice(-2) + ('0' + objDate.getDate()).slice(-2); if (valYMD == objYMD) { result = 1 } return result; } |
以上!お疲れ様でした。
所々覚えておきたいポイントがありましたので、忘れないようにしましょう。
コメント