Power Automate PR

[Power Automate]日付・日時の取得、変換、比較方法を徹底解説

記事内に商品プロモーションを含む場合があります

Power Automateの日付・日時の取得方法や各種変換や比較方法、および様々なケースの条件判定について説明します。

Power Automateを体系的に学習したい方は、下記もご覧ください。

承認フローについて詳細な手順を知りたい方は、下記もご覧ください。

Teamsを利用して組織内のコミュニケーションを強化したい方は下記もご覧ください。

【こちらもおすすめ】Teamsお役立ちノウハウ集

・【事例付き】Teamsを活用したマネジメントTIPS集
・【マネージャー向け】Teamsアプリを活用した「誰が何を知っているか」の集約・共有 事例集
・【Teamsアプリ活用事例集】メンター制度を置き換えて新人・異動者の育成を効率化する方法
・【問い合わせ管理でお困りの方向け】問い合わせ対応・ナレッジ蓄積へのTeams活用事例集
・【マネジメント・業務把握にお困りの方向け】マネジメント・報告業務へのTeams活用事例集
・【Teamsアプリを活用事例集】週報を自動で収集しサマリー&フィードバックする方法とは

Power Automateの日付・日時の概要

Power Automateには、「日付型」や「日時型」というデータ型はありません。

日付・日時は「文字列型」の値として扱います。

文字列型の変数としてPower Automate規定の日付・日時フォーマットで格納しておけば、Power Automateは日付・日時として解釈して処理可能になります。

Power Automateの変数のデータ型については、下記もご覧ください。

Power Automateの日付・日時の取得

現在日時を取得

現在日時を取得するには、アクションを利用する方法と関数を利用する方法があります。それぞれについて説明します。

「現在の時刻」アクションで現在日時を取得

下記の「現在の時刻」アクションで取得できます。

取得できる日時のフォーマットは下記のようになります。末尾の”Z”はUTC時刻であることを表します。そのため、実際にはこれを日本の日時に変換して利用することになります。

2023-03-30T01:23:23.8826093Z

日本日時への変換方法は、後述する「タイムゾーンの変換」をご覧ください。

また、日時フォーマットの変更方法は、「フォーマットの変換」をご覧ください。

utcnow関数で現在日時を取得

下記のように、utcnow関数を利用して、現在時刻を取得できます。

utcnow()

取得できる内容は、「現在の時刻」アクションと同じです。

過去や未来の日時を取得

現在日時ではなく、過去や未来の日時を取得するには、下記のような関数を利用します。

addDays関数、addHours関数、addMinutes関数、addSeconds関数

例えば、翌日の日時を取得したい場合は、下記のようにaddDays関数を利用します。utcnow()で取得した現在の日時に1を足して、翌日の日時を取得しています。

addDays(utcnow(),1)

前日の場合は、下記のようにマイナスの数値にします。

addDays(utcnow(),-1)

日本の時刻を取得したい場合にも、下記のようにaddDays関数で9時間プラスして取得できます。

addDays(utcnow(),9)

また、第3引数には日付フォーマットを指定できます。下記のように指定した場合、2023/03/31のように取得できます。

addDays(utcnow(),1,’yyyy/MM/dd’)

また、年や月単位で増減するようなaddYear関数やaddMonth関数はありませんが、addToTime関数を利用して実現できます。

下記は、addToTime関数で1年後の日時を取得する場合の例です。第4引数に日時フォーマットを入れることもできます。

addToTime(utcnow(),1,’Year’)

Yearの部分は、Year、Month、Week、Day、Hour、Minute、Secondから選択して指定できるため、様々な間隔で増減させた日時を取得できます。

Power Automateの日付・日時のフォーマット

Power Automateでは、「日付型」や「日時型」というデータ型は無いという説明をしました。

ここでは、文字列型として扱うPowerAutomateの日付・日時のフォーマットについて説明します。

標準フォーマット

Power Automateの日付・日時フォーマットは標準フォーマットとして下記が用意されています。

デフォルトは、ラウンドトリップ日時パターン(o)です。

フォーマット名記号フォーマット例
短い形式の日付パターンd2009/6/15
長い形式の日付パターンD2009年6月15日(月)
完全な日時パターン(短い形式の時刻)f2009年6月15日(月)午後1:45
完全な日時パターン(長い形式の時刻)F2009年6月15日(月)午後1:45:30
一般の日時パターン(短い形式の時刻)g2009/6/15 午後1:45
一般の日時パターン(長い形式の時刻)G2009/6/15 午後1:45:30
月日パターンm6月15日
ラウンドトリップ日時パターンo2009-06-15T13:45:30.0000000
RFC1123パターンr2009年6月15日(月)20:45:30 GMT
並べ替え可能な日時パターンs2009-06-15T13:45:30
短い形式の時刻パターンt午後1:45
長い形式の時刻パターンT午後1:45:30
世界共通の並べ替え可能な日時パターンu2009-06-15 13:45:30Z
汎用の完全な日時パターンU2009年6月15日(月)午後8:45:30
年月パターンy2009年6月

カスタムフォーマット

Power Automateで日付・日時を扱う場合、下記の記号を組み合わせて、標準フォーマットにはない任意の形式に変換できます。

中には単体では利用できない記号もあります。例えば”d”は単体で利用しても日付だけでなく年月日が表示されてしまいます。”Md”のように、単体でなければ正しく表示されます。

記号説明
“d”月の日にち(1〜31)
“dd”月の日にち(01〜31)
“ddd”曜日の省略名(例:木)
“dddd”曜日の完全名(例:木曜日)
“f”日時値の秒部分の1/10
“ff”日時値の秒部分の1/100
“fff”日時値の秒部分の1/1000
“ffff”日時値の秒部分の1/10000
“fffff”日時値の秒部分の1/100000
“ffffff”日時値の秒部分の1/1000000
“fffffff”日時値の秒部分の1/10000000
“F”日時値の秒部分の 1/10 (0 以外の場合)
“FF”日時値の秒部分の 1/100 (0 以外の場合)
“FFF”日時値の秒部分の 1/1000 (0 以外の場合)
“FFFF”日時値の秒部分の 1/10000 (0 以外の場合)
“FFFFF”日時値の秒部分の 1/100000 (0 以外の場合)
“FFFFFF”日時値の秒部分の 1/1000000 (0 以外の場合)
“FFFFFFF”日時値の秒部分の 1/10000000 (0 以外の場合)
“g”、”gg”時期または時代(年号)  ※”西暦”と表示されるのみ
“h”12時間形式の時間(1〜12)
“hh”12時間形式の時間(01〜12)
“H”24時間形式の時間(0〜23)
“HH”24時間形式の時間(00〜23)
“K”タイムゾーン情報
“m”分(0〜59)
“mm”分(00〜59)
“M”月(1〜12)
“MM”月(01〜12)
“MMM”月の省略名(例:Jan、localeをja-jpにすると1)
“MMMM”月の完全名(例:January、localeをja-jpにすると1月)
“s”秒(0〜59)
“ss”秒(00〜59)
“t”AM/PM指定子の最初の文字(例:A、localeをja-jpにすると午)
“tt”AM/PM指定子(例:AM、localeをja-jpにすると午前)
“y”年(0〜99)
“yy”年(00〜99)
“yyy”年(3桁以上)
“yyyy”年(4桁の数値)
“yyyyy”年(5桁の数値)
“:”時刻の区切り記号
“/”日付の区切り記号

Power Automateの日付・日時の変換方法

タイムゾーンの変換

「タイムゾーンの変換」アクションで変換できます。

例えば、「現在の時刻」アクションで取得したUTC時刻を日本時刻に変換する場合は、下記のようになります。

「タイムゾーンの変換」アクションを含む日時コネクタについて知りたい方は、下記もご覧ください。

フォーマットの変換(標準フォーマット→カスタムフォーマット)

日時・日付のフォーマットを標準フォーマットからカスタムフォーマットへ変換するためには、formatDateTime関数を利用します。

例えば、現在のUTC日時を2023年1月30日の書式に変換するには、下記のようにします。
※記号については、「カスタムフォーマット」の章をご覧ください。

formatDateTime(utcnow(),’yyyy年M月dd日’)

フォーマットの変換(カスタムフォーマット→標準フォーマット)

日時・日付のフォーマットをカスタムフォーマットから標準フォーマットへ変換するためには、parseDateTime関数を利用します。

例えば、「2023年1月30日」を標準フォーマットにするには、下記のようにします。
第1引数は、変換元の日付。第2引数は日本のためja-jp。第3引数は第1引数に入れた日付のフォーマットを指定します。
※記号については、「カスタムフォーマット」の章をご覧ください。

parseDateTime(‘2023年1月30日’,’ja-jp’,’yyyy年M月dd日’)

下記のように既定の標準フォーマットで出力されます。情報の無かった時刻については0で埋められます。

2023-03-30T00:00:00.0000000

Excelの日時データの変換

Excelの日時フォーマットはシリアル値で表されており、PowerAutomateとはフォーマットが異なります。

Excelの日時をPowerAutomateの日時フォーマットとして取得するには、「表内に存在する行を一覧表示」アクションでExcelデータを取得する際、下記のように”DateTime 形式”にISO 8601を指定します。

これで下記のようなPowerAutomateで利用できるフォーマットに変換されてExcelの日時データを取得できます。

2023-01-01T13:00:00.000Z

Excel Online for Businessコネクタについて知りたい方は、下記もご覧ください。

SharePointの日時データの変換

SharePointのリストのデータは「複数の項目の取得」アクション等で取得すると思いますが、日付書式のデータはとくに変換することなく取得できます。

ただし、タイムゾーンの設定により、意図しない時刻で取得している可能性があるため、取得した時刻がズレている場合は、タイムゾーン設定の変更や時刻のズレを合わせた上で扱うよう注意する必要があります。

Power Automateの日時の比較方法

Power Automateの日時の比較方法として、下記の2通りの方法を説明します。

①dateDifference関数で行う
②ticks関数、sub関数、div関数を組み合わせて行う

■①dateDifference関数で行う方法

下記のように比較したい2つの日時を比較したとします。

dateDifference(‘2022-02-20T10:10:10.000’,’2023-03-21T11:11:11.000′)

下記のように、日.時:分:秒のフォーマットで差分が出力されます。

394.01:01:01

次に、下記のように日数に差はなく時刻にのみ差があるものを比較したとします。

dateDifference(‘2023-03-21T10:10:10.000’,’2023-03-21T10:11:11.000′)

下記のように、日数に差がなければ、時:分:秒のフォーマットで差分が出力されます。

00:01:01

■②ticks関数、sub関数、div関数を組み合わせて行う方法

ticks関数は、指定した日時が、西暦1年1月1日からどれだけ経過しているかを100ナノ秒単位で表すシリアル値として返す関数です。
sub関数は、引き算(第1引数を第2引数で引く)の関数です。
div関数は、割り算(第1引数を第2引数で割る)の関数です。

比較した2つの日時をticks関数でシリアル値にします。そしてsub関数で差を出します。そしてdiv関数でシリアル値から日や時などに戻します。

例えば、日数の差を求めたい場合は、下記のように指定します。日数に換算するために、864000000000で割っています。

div(sub(ticks(‘2023-03-21T10:10:10.000’),ticks(‘2022-02-20T10:10:10.000’)),864000000000)

実行結果は394になります。394日の差分があることになります。

求めたい単位ごとに何で割るかは下記の表のようになります。

求める単位割る値
日数864000000000
時間36000000000
600000000
10000000

年の比較

年の比較は、先に説明した2つの方法では比較できません。

2022年12月31日と2023年1月1日の差は、1日の差ですが、年単位でみても差があり単純には比較できないためです。

そこで、年の差分を出す例ですが、下記の方法が考えられます。

sub(int(formatDateTime(日時①,’yyyy’,’ja-jp’)),int(formatDateTime(日時②,’yyyy’,’ja-jp’)))

formatDateTime関数で日時を’yyyy’のみに変換して、int関数で数値化します。そして、sub関数で差をとるという方法です。

月の比較

月の比較は、先に説明した2つの方法では比較できません。

2022年12月31日と2023年1月1日の差は、1日の差ですが、月単位でみても差があり単純には比較できないためです。

そこで、月の差分を出す例ですが、下記の方法が考えられます。

sub(add(mul(sub(int(formatDateTime(日時①‘,’yyyy’,’ja-jp’)),int(formatDateTime(日時②,’yyyy’,’ja-jp’))),12),int(formatDateTime(日時①,’MM’,’ja-jp’))),int(formatDateTime(日時②,’MM’,’ja-jp’)))

まず、下記のピンクの下線部分は、年のみで比較して、その差分に対してmul関数で12を掛けています。1年の差は、月でいうと12ヶ月分の差になるからです。
そして、その数値をadd関数で日時①の月に足して、sub関数で日時②の月との差分を出しているのが残りの部分です。

sub(add(mul(sub(int(formatDateTime(日時①‘,’yyyy’,’ja-jp’)),int(formatDateTime(日時②,’yyyy’,’ja-jp’))),12),int(formatDateTime(日時①,’MM’,’ja-jp’))),int(formatDateTime(日時②,’MM’,’ja-jp’)))

もっと簡単な方法もあるかもしれません。

なお、何ヶ月の差かはわからなくてもよくて、月をまたいでいるかどうかだけを知りたい場合は、下記のように’yyyyMM’の差分を見るだけで良さそうです。

sub(int(formatDateTime(日時①,’yyyyMM’,’ja-jp’)),int(formatDateTime(日時②,’yyyyMM’,’ja-jp’)))

日数の比較

dateDifference関数で行う方法

日数の比較結果を出した後は、何らかの条件式で数値を確認することになるため、結果を数値化する必要があります。ただし、dateDifference関数の実行結果のフォーマットは、「日.時:分:秒」の場合と「時:分:秒」の2パターンあるため、数値化するのに工夫が必要です。

数値化するため下記のようにします。実行結果には、dateDifference関数の実行結果が入ります。

int(if(contains(実行結果,’.’),split(実行結果,’.’)[0],0))

まず、contains関数で「.(ドット)」を含むかどうか確認します。
含む場合は、split(実行結果,’.’)[0]で、「.(ドット)」で分割した0番目の要素を返す。
含まない場合は、0を返すという処理です。
そして、int関数で数値化します。

ticks関数、sub関数、div関数を組み合わせて行う方法

下記のように求めます。日時①日時②に比較したい2つの日時を入れます

div(sub(ticks(日時①),ticks(日時②)),864000000000)

時間の比較

dateDifference関数で行う方法

時間の比較結果を出した後は、何らかの条件式で数値を確認することになるため、結果を数値化する必要があります。ただし、dateDifference関数の実行結果のフォーマットは、「日.時:分:秒」の場合と「時:分:秒」の2パターンあるため、数値化するのに工夫が必要です。

数値化するため下記のようにします。実行結果には、dateDifference関数の実行結果が入ります。

int(if(contains(実行結果,’.’),split(split(実行結果,’.’)[1],’:’)[0],split(実行結果,’:’)[0]))

まず、contains関数で「.(ドット)」を含むかどうか確認します。
含む場合は、split(split(実行結果,’.’)[1],’:’)[0]で、「.(ドット)」で分割した1番目の要素(時:分:秒)を返し、さらに「:(コロン)」で分割した0番目を返します。
含まない場合は、split(実行結果,’:’)[0]で、「:(コロン)で分割した0番目を返すという処理です。
そして、int関数で数値化します。

ticks関数、sub関数、div関数を組み合わせて行う方法

下記のように求めます。日時①日時②に比較したい2つの日時を入れます

div(sub(ticks(日時①),ticks(日時②)),36000000000)

分の比較

dateDifference関数で行う方法

分の比較結果を出した後は、何らかの条件式で数値を確認することになるため、結果を数値化する必要があります。ただし、dateDifference関数の実行結果のフォーマットは、「日.時:分:秒」の場合と「時:分:秒」の2パターンあるため、数値化するのに工夫が必要です。

数値化するため下記のようにします。実行結果には、dateDifference関数の実行結果が入ります。

int(if(contains(実行結果,’.’),split(split(実行結果,’.’)[1],’:’)[1],split(実行結果,’:’)[1]))

まず、contains関数で「.(ドット)」を含むかどうか確認します。
含む場合は、split(split(実行結果,’.’)[1],’:’)[1]で、「.(ドット)」で分割した1番目の要素(時:分:秒)を返し、さらに「:(コロン)」で分割した1番目を返します。
含まない場合は、split(実行結果,’:’)[1]で、「:(コロン)で分割した1番目を返すという処理です。
そして、int関数で数値化します。

ticks関数、sub関数、div関数を組み合わせて行う方法

下記のように求めます。日時①日時②に比較したい2つの日時を入れます

div(sub(ticks(日時①),ticks(日時②)),600000000)

秒の比較

dateDifference関数で行う方法

秒の比較結果を出した後は、何らかの条件式で数値を確認することになるため、結果を数値化する必要があります。ただし、dateDifference関数の実行結果のフォーマットは、「日.時:分:秒」の場合と「時:分:秒」の2パターンあるため、数値化するのに工夫が必要です。

数値化するため下記のようにします。実行結果には、dateDifference関数の実行結果が入ります。

int(if(contains(実行結果,’.’),split(split(実行結果,’.’)[1],’:’)[2],split(実行結果,’:’)[2]))

まず、contains関数で「.(ドット)」を含むかどうか確認します。
含む場合は、split(split(実行結果,’.’)[1],’:’)[2]で、「.(ドット)」で分割した1番目の要素(時:分:秒)を返し、さらに「:(コロン)」で分割した2番目を返します。
含まない場合は、split(実行結果,’:’)[2]で、「:(コロン)で分割した2番目を返すという処理です。
そして、int関数で数値化します。

ticks関数、sub関数、div関数を組み合わせて行う方法

下記のように求めます。日時①日時②に比較したい2つの日時を入れます

div(sub(ticks(日時①),ticks(日時②)),10000000)

Power Automateの日時関連の様々な条件指定

Power Automateで日時関連の条件式で必要になると考えられるいくつかの例を説明します。

○日だったら

下記のように日付のみを数値化します。それを指定した日付と一致するかどうかの条件式として利用して判定できます。

int(formatDateTime(‘2022-10-9T12:13:30.0000000′,’dd’,’ja-jp’))

‘dd’ではなく’d’の方が0埋めではないため’d’の方が適していますが、’d’単体だと年月日(2022/10/09)が出力されエラーになります(原因不明)。そのため’dd’でも支障はないため’dd’で実施しています。

月初だったら

下記のように日付のみを数値化します。それが1かどうかで月初かどうかを判定できます。

int(formatDateTime(‘2022-10-9T12:13:30.0000000′,’dd’,’ja-jp’))

ちなみに、月初を求めたい場合は、startOfMonth関数を使います。

例えば、下記のように指定します。

startOfMonth(‘2022-10-11T12:13:30.0000000’)

下記の実行結果になります。

2022-10-01T00:00:00.0000000

第2引数でフォーマットも指定できます。

月末だったら

月末を求めるには、下記のように指定します。

指定した日時の翌月の月初を出して、1日戻しています。

addDays(startOfMonth(addToTime(‘2022-10-11T12:13:30.0000000′,1,’Month’)),-1)

下記の実行結果になります。

2022-10-31T00:00:00.0000000

addDays関数の第3引数でフォーマットも指定できます。

下記のように、日付のみを指定して数値化することで月末日を出せますので、これを利用して確認したい日付が月末かどうか判別できます。

int(addDays(startOfMonth(addToTime(‘2022-10-11T12:13:30.0000000′,1,’Month’)),-1,’dd’))

○曜日だったら

曜日を求めるには、下記のように指定します。

dayOfWeek(‘2022-10-11T12:13:30.0000000’)

下記の実行結果になります。

2

数値と曜日は、下記の対応になります。

0:日曜、1:月曜、2:火曜、3:水曜、4:木曜、5:金曜、6:土曜

平日だったら

dayOfWeek関数で、1以上、5以下であることを条件式として判定できます。

土日だったら

dayOfWeek関数で、0または6であることを条件式として判定できます。

第○△曜日だったら

例えば、第2月曜日かどうかを判定したいとします。

1週目は、1日〜6日、
2週目は、7日〜13日、
3週目は、14日〜20日、
4週目は、21日〜27日、
5週目は、28日〜31日、
になります。

下記のように日付を出し、それが7以上、13以下であるか。

int(formatDateTime(‘2022-10-9T12:13:30.0000000′,’dd’,’ja-jp’))

そして、下記のように曜日を出し、それが月曜(1)であるか。

dayOfWeek(‘2022-10-11T12:13:30.0000000’)

上記をAND条件で判定することで、第2月曜日かどうかを判定できます。

基準日から○日前だったら

「日数の比較」の章の方法で、何日前かを求めれますので、それを条件式として判定できます。

基準日から○営業日前だったら

基準日から○営業日前かどうかを判定するのは少し複雑です。

基準日を20日として、順番に説明します。

まず、基準日の変数「基準日」を作成します。

そして、何日前かあらわす変数「○日前」と、何営業日前かをあらわす変数「○営業日」を作成します。

次に、確認したい対象の日付となる変数「現在日」を作成します。
ここでは例として2023年3月10日としています。

次に、変数「○日前」に、基準日と現在日の日数の差分を設定します。
sub関数を利用して差分を出しています。

次に、変数「○日前」の値が0になるまで、Do untilでループします。

ループ内では、平日だったら変数「○営業日前」に1を足すという処理をします。
そして、変数「○日前」は毎回1を減らします。
そして変数「○日前」が0になるまで繰り返します。

最後まで処理が完了した段階で、変数「○営業日前」の値が、何営業日前かを表しています。

まとめ

Power Automateの日付・日時の取得方法や各種変換や比較方法、および様々なケースの条件判定について説明しました。

その他、日時関連で行いたい処理がありましたら、お問い合わせください。

Power Automateを体系的に学習したい方は、下記もご覧ください。

承認フローについて詳細な手順を知りたい方は、下記もご覧ください。

Teamsを利用して組織内のコミュニケーションを強化したい方は下記もご覧ください。

【こちらもおすすめ】Teamsお役立ちノウハウ集

・【事例付き】Teamsを活用したマネジメントTIPS集
・【マネージャー向け】Teamsアプリを活用した「誰が何を知っているか」の集約・共有 事例集
・【Teamsアプリ活用事例集】メンター制度を置き換えて新人・異動者の育成を効率化する方法
・【問い合わせ管理でお困りの方向け】問い合わせ対応・ナレッジ蓄積へのTeams活用事例集
・【マネジメント・業務把握にお困りの方向け】マネジメント・報告業務へのTeams活用事例集
・【Teamsアプリを活用事例集】週報を自動で収集しサマリー&フィードバックする方法とは