【GAS】日付(Date)型データ同士の大小比較・等値確認
Google Apps Script(GAS)における日付(Date)型データを比較する方法を解説します。
先に結論をお伝えすると、特段の事情がなければgetTimeメソッドの戻り値に比較・等号演算子を用いて比較を行うのが一般的です。
この記事では、最頻出のgetTimeメソッドを利用する方法の他、valueOfメソッドを利用する方法、Number関数を利用する方法もご紹介しています。
Date型データ比較の基本
Date型データは比較演算子で大小比較できる
特段比較用のメソッド等はなく、数値同様に比較演算子(<=, < , >=, >)を使ってDateオジェクト同士の比較を行うことができます。
- Date1 < Date2:Date1がDate2より早い日付を表す
- Date1 > Date2:Date1がDate2より遅い日付を表す
let date_1 = new Date('2019/09/12');
console.log(date_1); //Thu Sep 12 2019 00:00:00 GMT+0900 (Japan Standard Tim
let date_2 = new Date('2019/09/13');
console.log(date_2); // Fri Sep 13 2019 00:00:00 GMT+0900 (Japan Standard Time)
console.log(date_1 < date_2); // true
console.log(date_1 <= date_2); // true
console.log(date_1 > date_2); // false
console.log(date_1 >= date_2); // false
Date型データにそのまま等値演算子は使えない
別々に宣言されたDate型のオブジェクトは、同じ日時だったとしてもオブジェクトそのものは異なるため、そのまま等値演算子(== / ===)を適応しても不一致となります。
let date_1 = new Date('2019-09-12');
console.log(date_1); //Thu Sep 12 2019 09:00:00 GMT+0900 (Japan Standard Time)
let date_2 = new Date('2019-09-12');
console.log(date_2); // Thu Sep 12 2019 09:00:00 GMT+0900 (Japan Standard Time)
console.log(date_1 == date_2); // false
console.log(date_1 === date_2); // false
これではプログラム内で「同じ日時」「同じ日付」等を判定はできません。下記パートでこの問題を解決して大小比較も等号確認もできる方法を3つご紹介します。
Date型データの比較方法3選
Date型の大小・等値比較を行うには以下の3つの方法のいずれかを使います。実務的には分かりやすい「getTimeメソッドを利用する」方法だけ覚えておけば問題ないでしょう。
- getTimeメソッドを使う
- valueOfメソッドを使う
- Number関数を使う
1.getTimeメソッドを使う
Date.getTime()
- 戻り値:1970年1月1日00:00:00からの経過ミリ秒
getTimeメソッドで比較可能な数値変換を行います。基準地点からの経過時間として対応する数値を返してくれるので、比較可能な値となります。
let date_1 = new Date('2019-09-12');
console.log(date_1.getTime()); //1568246400000
let date_2 = new Date('2019-09-12');
console.log(date_2.getTime()); // 1568246400000
console.log(date_1.getTime() == date_2.getTime()); // true
console.log(date_1.getTime() === date_2.getTime()); // true
2.valueOfメソッドを使う
Date.valueOf()
- 戻り値:1970年1月1日00:00:00からの経過ミリ秒
valueOfメソッドはgetTimeメソッドと同様の役割を果たします。
let date_1 = new Date('2019-09-12');
console.log(date_1.valueOf()); //1568246400000
let date_2 = new Date('2019-09-12');
console.log(date_2.valueOf()); // 1568246400000
console.log(date_1.valueOf() == date_2.valueOf()); // true
console.log(date_1.valueOf() === date_2.valueOf()); // true
3.Number関数を使う
Number(Date)
Number関数もgetTimeメソッドと同様です。
let date_1 = new Date('2019-09-12');
console.log(Number(date_1)); //1568246400000
let date_2 = new Date('2019-09-12');
console.log(Number(date_2)); // 1568246400000
console.log(Number(date_1) == Number(date_2)); // true
console.log(Number(date_1) === Number(date_2)); // true
任意の単位で2つの日付を比較する
上記の例は、厳密に年/月/日/時間/分/秒/ミリ秒を用いたDate型データの大小等号比較でした。プログラムの中には、日付単位までや月単位までのレベルで比較したい場合もあると思います。
例えば、スプレッドシート上の顧客データを取得して「日付ごとに売り上げ単価が最も高い順に顧客を並び替える」といった操作をする際、getTimeでの比較しかできないと正確な時間帯まで加味して並び替えを行われてしまい意図した操作ができません。
Utilityクラスのフォーマット変換を使う
日付さえ比較できれば時間帯等は関係ないといったシーンを想定します。その場合、UtilityクラスのformatDateメソッドを用いて自分が行いたい単位をそろえるのが最もわかりやすいです。自分が行いたいレベルを抽出して比較してください。
Utilities.formatDate(date, timeZone, format)
- date(必須):Dateオブジェクト
- timeZone(必須):タイムゾーン(日本時間であれば「’JST’」(Japan Standard Time)を指定)
- format(必須):表示させたいフォーマット形式(SimpleDateFormat 仕様に基づく形式)
下記の例だと、同日で時間帯が異なるためgetTimeメソッドでは一致しませんが、formatDateメソッドを用いて日付レベルでの確認をすると一致することがわかります。
let date_1 = new Date('2019-09-12 13:00')
let date_2 = new Date('2019-09-12 14:00');
console.log(date_1.getTime() == date_2.getTime()); // false
console.log(date_1.getTime() === date_2.getTime()); // false
let dt_1 = Utilities.formatDate(date_1, 'Asia/Tokyo', 'yyyy-mm-dd')
let dt_2 = Utilities.formatDate(date_2, 'Asia/Tokyo', 'yyyy-mm-dd')
console.log(dt_1 == dt_2); // true
console.log(dt_1 === dt_2); // true
まとめ
Date型オブジェクトの比較方法をご紹介しました。
- 通常の等号・比較記号を使ってデータ同士を比較する
- Date型データはそのまま直接等号確認はできない
- 等号確認を行うには、getTimeメソッド、valueOfメソッド、Number関数を使う方法がある
- 基本的にはgetTimeメソッドを使っておけば問題ない
- 任意のレベル(日単位・月単位等)でDate型データを比較したければ、UtilityクラスのformatDateメソッドを使って適したフォーマット指定をしてから比較する