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とは?できること・始め方で解説しています。

参考にした主な資料

ABOUT ME
IT解決チャンネル編集部
ExcelやWord、Windows、Googleスプレッドシートなど、ビジネスで使うITツールの使い方を初心者にもわかりやすく解説しています。関数の使い方から実務で役立つ応用テクニックまで、画像付きでていねいに紹介。パソコン操作で困ったときの頼れる情報源を目指しています。