目次
Salesforceフローを活用して業務を自動化する際、データの取得条件に日付や時間を利用することは非常に多いです。しかし、Salesforceはシステム内部では日付・時間情報をUTC(協定世界時)で管理しているため、日本時間(JST)で条件指定をすると意図しない結果になることがあります。本記事では、フローで日付・時間を軸にデータを取得する際に注意すべきUTCとJSTの違いについて解説します。
1. Salesforceの日時管理の基本
SalesforceのDateTime型のフィールドは、内部的には**UTC(協定世界時)**で保存されます。Salesforceでは「GMT」と表記されることもありますが、技術的にはUTCが正確な表現です。
ユーザーがUI上で日時を入力すると、Salesforceはそのユーザーのタイムゾーン設定に応じて表示を調整します。たとえば、日本のユーザーが「2025/09/06 10:00」と入力した場合、Salesforce内部では「2025/09/06 01:00 UTC」として保存されます。
つまり、ユーザーのタイムゾーン表示と内部的な保存時刻には差があることを理解しておく必要があります。
重要なポイント
- Date型項目:タイムゾーンの影響を受けない
- DateTime型項目:UTCで保存され、表示時にユーザーのタイムゾーンに変換される(今回はこの話です)
- Time型項目:タイムゾーンの影響を受けない
2. フローの「取得要素(Get Records)」での注意点
Salesforceフローで「取得要素」を使い、日付・時間を条件にレコードを取得する場合、問題が発生しやすいです。
例:特定時間帯のレコードを取得するケース
JSTで「2025/09/06 10:00~15:00」の間に作成されたレコードを取得したい場合:
JST時間
10:00 JST → 01:00 UTC
15:00 JST → 06:00 UTC
フローでの実際の条件は以下のようになります:
CreatedDate >= 2025/09/06 01:00:00Z AND
CreatedDate <= 2025/09/06 06:00:00Z
上記のようにJSTとUTCでは、9時間の差があるため意図した時間帯のレコードを取得できない結果になります。必ずデバック機能を使って意図した時間帯のレコードを取得できているか確認してください。
4. 対策方法
(1) Date型フィールドやDATEVALUE関数を利用する
日時の時間部分を気にせず「日付単位」で取得したい場合:
DATEVALUE(CreatedDate) = TODAY()
この方法により、ユーザータイムゾーンでの今日の日付として正確に判定できます。
(2) 数式リソースでタイムゾーン変換を行う
時間まで指定する場合は、数式リソースを使用してタイムゾーン変換を明示的に行います。
数式例:JST時刻をUTCに変換
DATETIMEVALUE("2025-09-06 10:00:00") - TIME(9, 0, 0, 0)
5. 注意すべきケース
スケジュールトリガーフロー
毎日午前0時に起動するスケジュールフローは、フローを作成したユーザーのタイムゾーン基準で実行されます。日本のユーザーが作成したフローであれば、JST午前0時に実行されます。
6. ベストプラクティス
推奨される設計パターン
- 日付のみの条件:
DATEVALUE()
関数を使用 - 時間を含む条件:数式リソースで明示的にタイムゾーン変換
- テスト:異なるタイムゾーンのユーザーでテストを実行
コード例:安全な日時条件の作成
数式リソース例
今日の開始時刻(JST 00:00をUTCに変換)
DATETIMEVALUE(TEXT(TODAY()) + " 00:00:00") - TIME(9, 0, 0, 0)
今日の終了時刻(JST 23:59をUTCに変換)
DATETIMEVALUE(TEXT(TODAY()) + " 23:59:59") - TIME(9, 0, 0, 0)
7. まとめ
Salesforceフローで日付・時間を条件にレコードを取得する際は、以下の点を押さえることが重要です:
重要ポイント
- SalesforceはDateTime型フィールドを内部的にUTCで管理
- JSTで条件を設定する場合は、UTCとの時差(-9時間)を考慮
- 日付単位での取得はDATEVALUE関数を使用
- 時間を含む条件は数式リソースで明示的に変換
これらを実践することで、取得ミスや意図しない動作を大幅に減らすことができます。