【Power Automate】日付の使い方|9時間ずれる原因と日本時間への変換方法
Power Automateで日付を扱うと、多くの人が最初にこの壁にぶつかります。
時刻が9時間ずれる。
原因ははっきりしています。Power Automateの日時はUTC(協定世界時)を基準に動いているためです。日本時間はUTCより9時間進んでいるので、そのまま使うと9時間前の時刻が出てきます。
この記事では、日本時間への変換を中心に、日付の取得・書式変更・加算・比較までを、実際に使える式とあわせて解説します。
現在の日時を取得する|utcNow()
まず基本となるのがutcNow()です。実行した瞬間の日時を返します。
utcNow()
→ 2018-03-15T13:27:36Z
末尾のZが「UTCである」という印です。この時点ではまだ日本時間ではありません。日本時間に直すと22時27分になります。
「フローを実行した時刻をメールに入れたら、9時間前になっていた」という現象は、これをそのまま使ったことが原因です。
【最重要】日本時間に変換する
UTCを日本時間に直す関数は2つあります。どちらを使っても構いません。
方法1:convertTimeZone(変換元と変換先を指定)
convertTimeZone('2018-01-01T00:00:00', 'UTC', 'Tokyo Standard Time')
→ 2018-01-01T09:00:00.0000000
0時が9時になっています。正しく9時間進みました。
方法2:convertFromUtc(UTCからの変換専用)
convertFromUtc('2018-01-01T08:00:00.0000000Z', 'Tokyo Standard Time')
→ 2018-01-01T17:00:00.0000000
変換元がUTCと決まっているなら、こちらのほうが短く書けます。
日本のタイムゾーン名は「Tokyo Standard Time」
ここを間違えると動きません。「Japan」でも「JST」でもなく、Tokyo Standard Time と書きます。主なタイムゾーン名は次のとおりです。
| 地域 | 指定する名前 |
|---|---|
| 日本 | Tokyo Standard Time |
| 協定世界時 | UTC |
| 米国東部 | Eastern Standard Time |
| 米国太平洋 | Pacific Standard Time |
| 中国 | China Standard Time |
| インド | India Standard Time |
実用形:これをコピーすれば使えます
「今の日本時間を、読みやすい形式で取得する」式がこちらです。公式ドキュメントにも同じ形が例示されています。
convertTimeZone(utcNow(), 'UTC', 'Tokyo Standard Time', 'yyyy-MM-dd HH:mm:ss')
4つ目に書式を指定できるため、変換と整形を1つの式で済ませられます。日付を扱う場面では、まずこの形を覚えておくと応用が利きます。
表示形式を変える|formatDateTime()
「2018-03-15T13:27:36Z」のままではメールに書けません。見やすい形に整えるのがformatDateTime()です。
formatDateTime('03/15/2018 12:00:00', 'yyyy-MM-ddTHH:mm:ss')
→ 2018-03-15T12:00:00
書式は自分で組み立てられます。よく使う指定子は次のとおりです。
| 書式 | 意味 | 結果の例 |
|---|---|---|
| yyyy | 西暦4桁 | 2026 |
| MM | 月2桁 | 08 |
| dd | 日2桁 | 15 |
| HH | 時(24時間) | 13 |
| mm | 分 | 27 |
| ss | 秒 | 36 |
組み合わせれば 'yyyy年MM月dd日' のような日本語表記も作れます。月は大文字のMM、分は小文字のmm——ここを取り違えると結果がおかしくなります。
なお、あらかじめ用意された短縮形もあります。
- o(既定)…ISO 8601形式
- d…短い日付形式(MM/dd/yyyy)
- D…長い日付形式
日付を足す・引く|addDays()
「3日後」「1週間前」といった計算にはaddDays()を使います。
addDays('2018-03-15T00:00:00Z', 10)
→ 2018-03-25T00:00:00.0000000Z
引き算専用の関数はありません。マイナスの値を渡します。
addDays('2018-03-15T00:00:00Z', -5)
→ 2018-03-10T00:00:00.0000000Z
時間単位で足したいときはaddHours()を使います。書き方は同じです。
| やりたいこと | 式 |
|---|---|
| 3日後 | addDays(utcNow(), 3) |
| 1週間前 | addDays(utcNow(), -7) |
| 2時間後 | addHours(utcNow(), 2) |
| 日本時間で明日 | convertTimeZone(addDays(utcNow(),1), ‘UTC’, ‘Tokyo Standard Time’) |
曜日や「その日の0時」を取得する
条件分岐と組み合わせるときに便利な関数です。
dayOfWeek('2018-03-15T13:27:36Z')
→ 4(木曜日)
startOfDay('2018-03-15T13:27:36Z')
→ 2018-03-15T00:00:00.0000000Z
dayOfWeek()は0が日曜日、1が月曜日……6が土曜日を表す数字を返します。「平日だけ実行したい」という条件は、この値が1〜5かどうかで判定できます。
startOfDay()は時刻を0時にそろえます。「日付だけで比べたい」ときに使うと、時刻の差で判定がずれるのを防げます。
日付を比較する
日付の大小は、条件でおなじみのlessやgreaterで判定します。「期日まで1日を切っているか」なら次のように書きます。
less(item()?['dueDate'], addDays(utcNow(),1))
「期日が明日より前」=「あと1日を切っている」という考え方です。日付そのものを引き算するのではなく、基準日を作って比べるのがコツです。
条件の組み立て方は条件分岐の使い方で詳しく解説しています。
よくあるつまずき
| 症状 | 原因と対処 |
|---|---|
| 時刻が9時間ずれる | UTCのまま使っている。convertTimeZoneで変換する |
| タイムゾーン変換が効かない | 名前の指定ミス。Tokyo Standard Timeと正確に書く |
| 分のはずが月になる | MM(月)とmm(分)の取り違え |
| 日付の比較がずれる | 時刻まで比較している。startOfDayでそろえる |
| 引き算ができない | 専用関数はない。addDaysにマイナスを渡す |
よくある質問
Q. なぜUTCで動いているのですか?
世界中で使われるサービスのため、基準をひとつに定める必要があるからです。国ごとの時差を含まないUTCを内部の基準にし、表示するときに各国の時間へ変換する設計になっています。
Q. 変換と書式指定はどちらを先にすべきですか?
変換が先です。書式を整えてから変換しようとすると、うまく解釈されないことがあります。convertTimeZoneの4番目に書式を指定すれば、1つの式で完結します。
Q. 「日付だけ」を取り出せますか?
formatDateTimeで'yyyy-MM-dd'を指定すれば、日付部分だけの文字列になります。ただし文字列になるため、その後の日付計算には使えません。計算が必要なら元の値を残しておいてください。
Q. 式はどこに入力しますか?
入力欄を選ぶと表示される動的なコンテンツのパネルに「式」タブがあります。そこに関数を書いて追加します。
まとめ
- Power Automateの日時はUTC基準。そのままだと9時間ずれる
- 日本時間への変換はconvertTimeZoneまたはconvertFromUtc
- 日本のタイムゾーン名はTokyo Standard Time
- 実用形は
convertTimeZone(utcNow(), 'UTC', 'Tokyo Standard Time', 'yyyy-MM-dd HH:mm:ss') - 書式変更はformatDateTime。MMが月、mmが分
- 加算・減算はaddDays。引き算はマイナスの値を渡す
- 曜日はdayOfWeek(0が日曜)、日付だけの比較はstartOfDay
- 大小比較はless・greaterで、基準日を作って比べる
日付がらみの不具合は、まず「UTCのままではないか」を疑うだけで大半が解決します。実行履歴で実際の値を確認しながら組み立ててみてください。
Power Automateの基本はPower Automateとは?できること・始め方で解説しています。
参考にした主な資料
- ワークフロー定義言語の関数リファレンス(Microsoft Learn)— utcNow・addDays・formatDateTime・convertTimeZone・startOfDay・dayOfWeek の書式と実行例、タイムゾーン名の指定方法







