コミュニティチャンネルで話題になって日付まわりでなるほど。と思ったことを忘れないようにまとめておきます。
事象
親子テーブルなど複数のテーブルがあり、そのテーブル間でテータを転記するようなシーンで発生しました。今回はAテーブルとBテーブルにします。
それぞれのテーブルにはエディタで日付項目(日付A
)が有効化されています。
Aテーブルで適当にデータを追加します。
次にBテーブルを用意します。
Aテーブルと同じように日付項目を追加しておきます。Bテーブルでは、データ作成時に日付は設定しないでください。
両方のテーブルで準備ができたのでAテーブルに戻り、サーバースクリプトを書きます。
try { context.Log(model.DateA); const data = { DateHash: { DateA: model.DateA, } }; items.Update({更新するBテーブルのレコード}, JSON.stringify(data)); } catch (e) { context.Log(e.stack); }
{更新するBテーブルのレコード}
は、Bテーブルで作成したレコードのIDと置き換えてください。
これで処理を実行してみます。
Aテーブル
Aテーブルに2024/10/21
と入力して保存します。
Bテーブルに移動して確認すると2024/10/20
と表示されています。
あれ?と思いますよね。
解決方法
Pleasanterは画面上では、JST
(日本時間の場合)で表示され、サーバースクリプトではUTC
で処理が実行されます。
今回は、そこにitems.Update()
を使って他テーブルにデータを更新する処理を追加しています。この処理はJST
で実行されます。引っかかりポイントは日付を自動変換してくれないため、ここで思い違いが発生して期待値とズレが生まれてしまいます。
ドキュメントには作成例として記載されているので、よくドキュメントを読んでいる方は気づいていたかもしれませんが、toLocaleString()
を使って変換をする必要があります。
開発者向け機能:サーバスクリプト:items.Upsert | Pleasanter
try { + const date = model.DataA; + const jstDate = date.toLocaleString("ja-JP",{ timeZone: "jst" }); + context.Log(date); + context.Log(jstDate); - context.Log(model.DateA); const data = { DateHash: { + DateA: jstDate, - DateA: model.DateA, } }; items.Update({更新するBテーブルのレコード}, JSON.stringify(data)); } catch (e) { context.Log(e.stack); }
コードを変更したら再びAテーブルで更新ボタンを押してみます。すると、Bテーブルで日付が2024/10/21
に変わって期待した結果になりましたね。