普通にnew Dateしたらアメリカ太平洋時間(PST)
ServiceNowのServer SideのJavaScriptで現在日とその前日を取得しようとしてこちらを参考にして
以下のようなScriptを実装して
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で夜中に試していい感じだったので
Scheduled jobに仕込んで毎朝実行してみたら期待していた日の前日が取れ続けてしまって…
調べたところJavaScriptを実行したAPサーバーはPSTになってるようで(以下はFilter navigatorにstats.doと打ち込んでエンターした画面です)
日本時間(JST)とアメリカ太平洋時間(PST)の時差が17時間だったので17時以降は実行した日がたまたま取得できていたようで朝実行したら前日になってしまったようです
GlideDateTimeを使う
そういえばGlideDatetimeというクラス(ライブラリ)があったな…と思い出して調べてこちらを参考にして
こんな感じでScripts - Backgroundで試して
var gdt = new GlideDateTime();
gs.info(gdt.getDate());
gdt.addDays(-1);
gs.info(gdt.getDate());
いい感じだったので
Scheduled jobにしてExecute NowにしたらErrorログが出て処理に失敗して…
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を使えとなっているのでこう直して
var gdt = new GlideDateTime();
gs.info(gdt.getDate());
gdt.addDaysLocalTime(-1);
gs.info(gdt.getDate());
今度こそいい感じ
日付のフォーマットはglide.sys.date_formatで決まっている様子
Version Upなどで日付のフォーマット(yyyy-MM-dd)が変わってしまうことは無いか不安になったので調べたらsys_propertiesのglide.sys.date_formatで決まっているようで…こちらが変更されない限りは大丈夫なようです