【ServiceNow】ServiceNowとJavaScriptの日付取得の違い

ServiceNow
DIチーム

こんにちは。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独自オブジェクト)における、
時間の扱い方の違いを見てきました。

特にタイムゾーンの考え方を理解していないと、
意図しない挙動に悩まされることになります。

最初は少し難しく感じるかもしれませんが、自分の扱いたいオブジェクトがどのような値を扱うのかを、内部的な観点から押さえておくことで、安定した開発が可能になります。
本記事が日付処理に対する理解の一助となれば幸いです。

お問い合わせはこちら

記事を書いた人

DIチーム

主にServiceNowに関するお役立ち情報をお届けします!

関連記事

TOP