LoginSignup
0
0

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

Last updated at Posted at 2024-02-26

普通に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で夜中に試していい感じだったので

image.png

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

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

image.png

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

GlideDateTimeを使う

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

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

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

いい感じだったので

image.png

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());

今度こそいい感じ

image.png

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

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

image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0