とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど

開催予定の勉強会

読者登録と各種SNSのフォローもよろしくお願いいたします。

Pleasanterで他テーブルへ日付項目をサーバスクリプトから転記すると1日前の日付が転記される時の対処方法

コミュニティチャンネルで話題になって日付まわりでなるほど。と思ったことを忘れないようにまとめておきます。

事象

親子テーブルなど複数のテーブルがあり、そのテーブル間でテータを転記するようなシーンで発生しました。今回は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に変わって期待した結果になりましたね。