ServiceNowのサーバーサイドスクリプト(ビジネスルールなど)で、「開始日」と「終了日」のように2つの日付を比較しなければならない場面は頻繁に発生します。しかし、GlideDateTime オブジェクトをJavaScriptの標準演算子(< や >)でそのまま直感的に比較しようとして、意図しない挙動になった経験はありませんか? ここでは、ServiceNowで2つの日時を正確かつ安全に比較するためのベストプラクティスとコード例を解説します。
なぜ標準の演算子での直接比較がNGなのか?
- 日付データを格納している
GlideDateTimeは、単なる数値や文字列ではなく**オブジェクト(Object)**です - そのため、
date1 > date2のような通常のJavaScriptの比較を行おうとすると、日時の前後関係ではなくメモリ上のオブジェクト参照同士を比較してしまい、多くの場合で誤ったバグの原因となります
推奨される2つの比較方法
ServiceNowでは、日時の比較に特化した専用メソッドが用意されています。目的や好みに応じて以下のいずれかを使用してください。
- 方法1:
compareTo()メソッドを使用する(最も推奨)- 2つの
GlideDateTimeオブジェクト同士を安全に比較するための標準メソッドです - 比較した結果として
-1(過去),0(完全に同一日時),1(未来) のいずれかの数値を返します
- 2つの
- 方法2:
getNumericValue()メソッドを使用する- それぞれの日時を「エポック秒(1970年からのミリ秒)」という巨大な純粋数値(Integer)に変換します
- 実態が数値データになるため、JavaScriptの標準演算子(
<や==など)を使った直感的な比較式が書けるようになります
実装コード例(アンチパターンと推奨策)
❌ アンチパターン(常に誤判定される危険なスクリプト)
var startDate = new GlideDateTime("2026-04-01 10:00:00");
var endDate = new GlideDateTime("2026-04-10 10:00:00");
// 警告:オブジェクト同士を直接比較しているため、正しく判定されません
if (startDate < endDate) {
gs.info("終了日は開始日より後です"); // これは期待通りに動かない可能性が高いです
}
✅ ベストプラクティス1(compareTo() を使った安全な比較)
var startDate = new GlideDateTime("2026-04-01 10:00:00");
var endDate = new GlideDateTime("2026-04-10 10:00:00");
// compareTo() を使用して比較します
// 対象(endDate)が基準(startDate)より未来の場合は -1 が返されます
if (startDate.compareTo(endDate) == -1) {
gs.info("終了日は開始日より後です(正しい判定です)");
} else if (startDate.compareTo(endDate) == 1) {
gs.info("開始日の方が未来です(日付の逆転エラー等のアラートを出す)");
} else {
gs.info("開始日と終了日は完全に同時刻です");
}
✅ ベストプラクティス2(getNumericValue() を使った数値比較)
var startDateNum = new GlideDateTime("2026-04-01 10:00:00").getNumericValue();
var endDateNum = new GlideDateTime("2026-04-10 10:00:00").getNumericValue();
// 変数が完全にミリ秒の数値に変換されているため、JavaScriptの演算子で安全に比較できます
if (startDateNum < endDateNum) {
gs.info("終了日は開始日より後です(正しい判定です)");
}
まとめ
GlideDateTimeオブジェクト同士を、通常のJavaScriptの比較演算子(<や>)で直接比較するのは絶対に避けましょう- スクリプトエラーを防ぐため、汎用性の高い標準組み込みメソッドである
compareTo()を使用する習慣をつけるのがベストです - どうしても不等号などの数式で比較を処理したい場合は、
getNumericValue()を使って一度データを数値(ミリ秒)に変換してから比較しましょう
一言まとめ: 👉 日付比較は直感的な不等号演算を避け、compareTo() や getNumericValue() で確実に判定しよう!