【ServiceNow】ServiceNowとJavaScriptの日付取得の違い
こんにちは。ServiceNow担当のなちです。
ServiceNowで開発をしていると、日付や時刻を扱う場面は多くあります。
その中で「思った時間と違う値が入っている」「なぜか時間がずれる」と感じたことはありませんか?
実はこの原因の多くはJavaScriptの組み込みオブジェクト(以下、JS標準オブジェクト)と、ServiceNowが提供するプラットフォームオブジェクト(以下、SN独自オブジェクト)での日付の扱いの違いにあります。
本記事では、JS標準オブジェクトとSN独自オブジェクトの違いを整理し、タイムゾーンによるズレを防ぐためのポイントを解説します。
タイムゾーンとは
タイムゾーンとは、ある地域で共通に使われる時刻のルールです。
日本であれば「日本標準時(JST)」が使われており、これはUTC(協定世界時)+9時間となっています。
システム開発において重要なのは、以下の2つの概念です。
- UTC(協定世界時):時刻データを扱うための世界共通の基準時刻
- ローカルタイム:ユーザーのタイムゾーンに応じた表示上の時刻
多くのシステムでは、データの整合性を保つためにUTCで保存し、表示時にローカルタイムへ変換する仕組みが採用されています。
ServiceNowもまた、この考えに基づいています。
JavaScript組み込みの日付オブジェクト
JS標準オブジェクトでは、Dateオブジェクトを使用して日付を扱います。

(上記コードはブラウザなどのクライアント環境で実行した場合の書き方)
JS標準オブジェクトは、実行環境により、時間の扱いが異なります。
ブラウザ等のクライアントサイドであれば、使用しているPCの時間に準拠し、
サーバーで動いていれば、サーバーのタイムゾーンを参照します。
一方で、toISOString()などのメソッドを使用することで、UTC形式の値も取得可能です。
つまり、JS標準オブジェクトでは、
基本は実行環境に準拠した時間を扱う
という考え方になります。
ServiceNow独自APIの日付オブジェクト
ServiceNowでは、主に以下のオブジェクトを使用して日付を扱います。
- GlideDateTime
- GlideDate
例として、GlideDateTimeを見てみましょう。

ここで重要なのは、SN独自オブジェクトではデータはUTCで保持される、という点です。
GlideDateTime():UTCの値を取得
getDisplayValue():ユーザーのタイムゾーンに変換された値を取得
つまり、内部的には常にUTCで管理されており、表示時にユーザーごとの設定に応じて変換されます。
保存はUTC、表示でローカル変換
これがSN独自オブジェクトでの基本的な考え方です。
JS標準オブジェクトとSN独自オブジェクトの違い
ここまでの内容を整理すると、以下のようになります。
- JS標準オブジェクトのnew Date()(クライアントサイド):PC時間
- JS標準オブジェクトのnew Date()(サーバーサイド):サーバー時間
- GlideDateTime():UTCの値を取得
- GlideDateTime().getDisplayValue():ユーザーのタイムゾーンに変換された値を取得
今回はServiceNow内でそれぞれを扱うため、実行されるJS標準オブジェクトのnew Date()は、サーバー側の時間を扱います。
実験してみた
ここからは、SN独自オブジェクトとJS標準オブジェクトの日付取得方法の違いをより理解するため、簡単な検証を行います。
①基本検証
時間設定は以下の通りです。
ServiceNowサーバー時間:アメリカ/PDT(米国太平洋夏時間)(UTC-7)
ユーザー時間:日本(UTC+9)
インスタンス時間:日本(UTC+9)
パソコン時間:日本(UTC+9)
UTC:協定世界時
※ServiceNowの環境ごとのサーバー時間は、アプリケーションメニューで「stats.do」を打ち込むと表示させることができます。
今回の実験に使用した環境では以下のようになっていました。

PDTと書かれているため、このDemo Serverのサーバー時間はPDT(米国太平洋夏時間)時間を取ってきているということが分かります。
実験時の時間は
アメリカ:2026/4/20 20:52
日本:2026/4/21 12:52
UTC:2026/4/21 3:52
以下のスクリプトをServiceNowのバックグランドスクリプトで実行します。

検証結果

JS標準オブジェクトのDate→アメリカ/PDT
GlideDateTime(getValue)→UTC
GlideDateTime(getDisplayValue)→日本
となっていることがわかります。
②ユーザーのタイムゾーン変更
次に、ユーザーのタイムゾーンを変更して実行してみます。
ユーザーアイコンのPreferencesから、Timezoneを「US/Hawaii」に設定します。

以下の設定で実行します。
・ServiceNowサーバー時間:アメリカ(PDT(UTC-7))
・ユーザー時間:US/Hawaii(UTCー10)
・インスタンス時間:日本(UTC+9)
・パソコン時間:日本(UTC+9)
・UTC:協定世界時
実験時の時間は
アメリカ:2026/4/20 20:59
日本:2026/4/21 12:59
UTC:2026/4/21 3:59
ハワイ:2026/4/20 17:59
です。
検証結果

・JS標準オブジェクトのDate→アメリカ/PDT=サーバー時間
・GlideDateTime(getValue)→UTC
・GlideDateTime(getDisplayValue)→US/Hawaii=ユーザー時間
となっていることがわかります。
よって、ユーザー時間を変更すると、SN独自オブジェクトのgetDisplayValue()で取れる値に影響することが分かります。
③ServiceNowインスタンス時間変更
また、ServiceNowのインスタンス自体の時間も変更して実行してみます。
アプリケーションメニューで「Basic Configuration UI16」と検索してページを開き、System timezone for all users unless overriden in the user’s recordと書かれた項目のプルダウンを変更します。

以下の設定で実行します。
・ServiceNowサーバー時間:アメリカ(PDT(UTC-7))
・ユーザー時間:日本(UTC+9)
・インスタンス時間:Europe/Paris(UTC+2)
・パソコン時間:日本(UTC+9)
・UTC:協定世界時
(インスタンス時間を変更すると自動的にユーザー設定時間が変更されてしまうため、インスタンス時間変更後にユーザー時間をJSTに再設定しました。)
実験時の時間は
アメリカ:2026/4/20 21:16
日本:2026/4/21 13:16
UTC:2026/4/21 4:16
パリ:2026/4/21 8:16
です。
検証結果

・JS標準オブジェクトのDate→アメリカ/PDT=サーバー時間
・GlideDateTime(getValue)→UTC
・GlideDateTime(getDisplayValue)→日本=ユーザー時間
この場合、getDisplayValue()は、インスタンス時間に関係なく、ユーザー時間を取ってきていました。
④PCの時間変更
次に、実行環境による違いを確認するため、
PCの時刻設定を変更して同様のスクリプトを実行してみました。
PCの設定画面でタイムゾーンを変更します。

以下の設定で実行します。
・ServiceNowサーバー時間:アメリカ(PDT(UTC-7))
・ユーザー時間:日本(UTC+9)
・インスタンス時間:日本(UTC+9)
・パソコン時間:クリスマス島(UTC+14)
・UTC:協定世界時
実験時の時間は
アメリカ:2026/4/20 21:57
日本:2026/4/21 13:57
UTC:2026/4/21 4:57
クリスマス島:2026/4/21 11:57
です。
検証結果

・JS標準オブジェクトのDate→アメリカ/PDT=サーバー時間
・GlideDateTime(getValue)→UTC
・GlideDateTime(getDisplayValue)→日本=ユーザー時間
PCの設定時間はクライアントサイドであり、ServiceNowのサーバーサイドで使用しているJS標準オブジェクトには変化がなく、ServiceNowのサーバー時間を取ってきていました。
⑤クライアントサイドで取得される日付
最後に、ServiceNow内のクライアントサイドスクリプトで、日付取得をしてみます。
クライアントスクリプトに以下のスクリプトを設定します。

現状の設定時刻は日本になっています。

この状態でメッセージを表示させると、

次に、PCの時間設定をフィジーに設定して実験します。

すると、

フィジーの時間を表示することができました。
結果、クライアントスクリプトでJS標準オブジェクトのDateを使用すると、PCの時間を取ってきていました。
実験より、以下の結果であることが分かりました。

ハマりやすいポイント
今回の検証から、SN独自オブジェクトとJS標準オブジェクトの日付の扱いの違いにより、意図しないズレが発生するケースがあることも想像できます。
特に、以下のような場面では注意が必要です。
- 現在時刻を使って処理をしたいとき
例えば、「現在時刻を取得してレコードに登録したい」といった場合、
・JS標準オブジェクト:ServiceNowサーバー時間
・SN独自オブジェクトのgetDisplayValue():ユーザー時間
が取得されるため、同じ”現在時刻”でも異なる値が保存されてしまう可能性があります。
- 日付の比較処理をしたいとき
例えば、「現在時刻より過去かどうかを判定する」処理では、
取得元の時間の基準が異なると、本来は過去のはずなのに未来と判定される、
といったズレが発生することがあります。
- 画面に表示されている時間をそのまま使いたいとき
ServiceNowでは、作成日時などに表示される時間はユーザーのタイムゾーンに変換された値です。
そのため、表示値をそのまま処理に使うと、内部のUTC時間とのズレによって、
意図しない結果になる可能性があります。
「どの環境で取得した時間か」「内部値か表示値か」を意識して使い分けることが重要です。
おわりに
今回は、Javascriptの組み込みオブジェクト(JS標準オブジェクト)と
ServiceNow独自APIのオブジェクト(SN独自オブジェクト)における、
時間の扱い方の違いを見てきました。
特にタイムゾーンの考え方を理解していないと、
意図しない挙動に悩まされることになります。
最初は少し難しく感じるかもしれませんが、自分の扱いたいオブジェクトがどのような値を扱うのかを、内部的な観点から押さえておくことで、安定した開発が可能になります。
本記事が日付処理に対する理解の一助となれば幸いです。





