ServiceNowのServer Sideで現在日とその前日を利用する(GlideDatetimeを使う)

# 普通にnew Dateしたらアメリカ太平洋時間(PST)

ServiceNowのServer SideのJavaScriptで現在日とその前日を取得しようとしてこちらを参考にして

https://www.tohoho-web.com/js/date.htm#getset

以下のようなScriptを実装して

```javascript
var date = new Date();
var t_d = date.getFullYear() + '/' + ('0' + (date.getMonth() + 1)).slice(-2) + '/' + ('0' + date.getDate()).slice(-2);
gs.info(t_d);
date.setDate(date.getDate() -1 );
var y_d = date.getFullYear() + '/' + ('0' + (date.getMonth() + 1)).slice(-2) + '/' + ('0' + date.getDate()).slice(-2);
gs.info(y_d);
```

Scripts - Backroundsで夜中に試していい感じだったので

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/43384240-6c2c-4a1c-fa7f-d9897a39b54d.png)

Scheduled jobに仕込んで毎朝実行してみたら期待していた日の前日が取れ続けてしまって…

調べたところJavaScriptを実行したAPサーバーはPSTになってるようで(以下はFilter navigatorにstats.doと打ち込んでエンターした画面です)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/f83ee738-c889-9b90-6d15-26b6e2c6cec9.png)

日本時間(JST)とアメリカ太平洋時間(PST)の時差が17時間だったので17時以降は実行した日がたまたま取得できていたようで朝実行したら前日になってしまったようです

# GlideDateTimeを使う

そういえばGlideDatetimeというクラス(ライブラリ)があったな…と思い出して調べてこちらを参考にして

https://servicenow-lab.com/handling_date_time/

こんな感じでScripts - Backgroundで試して

```javascript
var gdt = new GlideDateTime();
gs.info(gdt.getDate());
gdt.addDays(-1);
gs.info(gdt.getDate());
````

いい感じだったので

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/c07f2d73-5193-a63b-2565-1d735e5a8f2d.png)

Scheduled jobにしてExecute NowにしたらErrorログが出て処理に失敗して…

```Java
x_xxxxxxxx_tsuyudaku: 2024-02-26
Evaluator.evaluateString() problem: java.lang.SecurityException: Function addDays is not allowed in scope x_xxxxxxxx_tsuyudaku. User either addDaysUTC() or addDaysLocalTime() instead: 	com.glide.script.fencing.ScopedNativeJavaUtil.shouldAllow(ScopedNativeJavaUtil.java:40)
	com.glide.script.fencing.ScopedNativeJavaObject.get(ScopedNativeJavaObject.java:26)
	org.mozilla.javascript.ScriptableObject.getProperty(ScriptableObject.java:2097)
	org.mozilla.javascript.ScriptRuntime.getPropFunctionAndThisHelper(ScriptRuntime.java:2394)
	org.mozilla.javascript.ScriptRuntime.getPropFunctionAndThis(ScriptRuntime.java:2380)
	org.mozilla.javascript.Interpreter.interpretLoop(Interpreter.java:1349)
	org.mozilla.javascript.Interpreter.interpret(Interpreter.java:830)
	org.mozilla.javascript.InterpretedFunction.lambda$call$0(InterpretedFunction.java:160)
	com.glide.caller.gen.null_null_script.call(Unknown Source)
	com.glide.script.ScriptCaller.call(ScriptCaller.java:18)
	org.mozilla.javascript.InterpretedFunction.call(InterpretedFunction.java:159)
	org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:597)
	org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3573)
	org.mozilla.javascript.InterpretedFunction.exec(InterpretedFunction.java:172)
	com.glide.script.ScriptEvaluator.execute(ScriptEvaluator.java:397)
	com.glide.script.ScriptEvaluator.evaluateString(ScriptEvaluator.java:209)
	com.glide.script.ScriptEvaluator.evaluateString(ScriptEvaluator.java:137)
	com.glide.script.fencing.GlideScopedEvaluator.evaluateScript(GlideScopedEvaluator.java:348)
	com.glide.script.fencing.GlideScopedEvaluator.evaluateScript(GlideScopedEvaluator.java:240)
	com.glide.script.fencing.GlideScopedEvaluator.evaluateScript(GlideScopedEvaluator.java:219)
	com.glide.processors.ScriptProcessor.evaluateScript0(ScriptProcessor.java:399)
	com.glide.processors.ScriptProcessor.lambda$evaluateScriptWithRecordingOption$0(ScriptProcessor.java:382)
	com.glide.rollback.recording.RollbackRecorder.execute(RollbackRecorder.java:67)
	com.glide.processors.ScriptProcessor.evaluateScriptWithRecordingOption(ScriptProcessor.java:382)
	com.glide.processors.ScriptProcessor.evaluateScript(ScriptProcessor.java:362)
	com.glide.processors.ScriptProcessor.runScript(ScriptProcessor.java:261)
	com.glide.processors.ScriptProcessor.process(ScriptProcessor.java:219)
	com.glide.processors.AProcessor.runProcessor(AProcessor.java:677)
	com.glide.processors.AProcessor.processTransaction(AProcessor.java:288)
	com.glide.processors.ProcessorRegistry.process0(ProcessorRegistry.java:184)
	com.glide.processors.ProcessorRegistry.process(ProcessorRegistry.java:172)
	com.glide.ui.GlideServletTransaction.process(GlideServletTransaction.java:51)
	com.glide.sys.Transaction.run(Transaction.java:2501)
	com.glide.ui.HTTPTransaction.run(HTTPTransaction.java:27)
	java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	java.base/java.lang.Thread.run(Thread.java:829)

Background message, type:error, message: Function addDays is not allowed in scope x_xxxxxxxx_tsuyudaku. User either addDaysUTC() or addDaysLocalTime() instead
```

ErrorメッセージによるとaddDaysは自作のCustomアプリケーションから使うことは許可されておらずGlobalアプリケーションじゃないと使えないから代わりにaddDaysUTCかaddDaysLocalTimeを使えとなっているのでこう直して

```javascript
var gdt = new GlideDateTime();
gs.info(gdt.getDate());
gdt.addDaysLocalTime(-1);
gs.info(gdt.getDate());
````

今度こそいい感じ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/c07f2d73-5193-a63b-2565-1d735e5a8f2d.png)

:::note info
と思ったのですがこの記述だとUTCになってるかもです　未テストですごめんなさい
:::

## 日付のフォーマットはglide.sys.date_formatで決まっている様子

Version Upなどで日付のフォーマット(yyyy-MM-dd)が変わってしまうことは無いか不安になったので調べたらsys_propertiesのglide.sys.date_formatで決まっているようで…こちらが変更されない限りは大丈夫なようです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/37b5e808-8341-2638-12cc-05ea47fbcc60.png)