Power Automate formatDateTime: 構文、書式文字列、例
By Mirko Peters ·
Power Automate の formatDateTime を解説します。構文、よく使う書式文字列、convertTimeZone によるタイム ゾーンの扱い、日付や時刻が誤って表示される原因となるミスを取り上げます。
Automatically translated with AI from the original post. Read the English original
Power Automate の formatDateTime は、日付と時刻を目的のテキストに変換します。構文は formatDateTime(timestamp, format, locale) で、format と locale は省略可能です。戻り値は文字列です。たとえば formatDateTime(utcNow(), 'dd-MM-yyyy') は、現在の UTC 日付を日、月、年の順で返します。この記事は、フローを作成していて、メール、ファイル名、SharePoint の列に 2023-10-22T00:00:00Z のような値が出てしまう方を対象としています。構文、よく使う書式文字列、タイム ゾーンの落とし穴、一般的なパターンの一覧、結果が誤る原因となるミスを解説します。
重要なポイント
- 構文は formatDateTime(timestamp, format, locale) で、format と locale は省略可能です。戻り値は常に文字列です。
- format を省略すると、ISO 8601 のラウンドトリップ パターンが返されます。たとえば 2018-03-15T00:00:00.0000000 のような形式です。
- 書式文字列では大文字と小文字が区別されます。MM は月、mm は分です。HH は 24 時間制の時、hh は 12 時間制の時を表します。
- Power Automate は既定で UTC を使用します。そのため、convertTimeZone または convertFromUtc で先にタイム ゾーンを変換してから、結果を書式設定してください。
- 型を指定した値と書式文字列は一重引用符で囲みますが、動的コンテンツは一重引用符で囲まないでください。
formatDateTime の仕組み
この関数はタイムスタンプを受け取り、書式を変換します。フローでの日付と時刻の値の書式設定に関する Microsoft の記事では、最初の引数を書式を設定する日付と時刻と説明しています。手入力することも、動的コンテンツから渡すこともできます。手入力する場合は、2009-06-15T13:45:30 のような ISO 8601 形式にします。2 番目の引数は書式文字列です。1 文字の場合は標準書式文字列になります。2 文字以上の場合はカスタム書式文字列となり、月、日、年、時、秒などの位置や精度を制御します。
Microsoft のワークフロー式リファレンスから、覚えておきたい点が 3 つあります。
- 書式は省略可能です。省略すると既定のパターンは
oになります。Microsoft はこれを、タイム ゾーン情報を保持した ISO 8601 と説明しています。formatDateTime('03/15/2018')は'2018-03-15T00:00:00.0000000'を返します。 - 無効な書式はエラーになります。フローの実行は失敗するため、パターンの入力ミスは実行履歴に表示されます。
- locale は省略可能です。省略すると
en-usになります。無効な locale はエラーになります。別の言語で月名や曜日名を表示するには、locale を指定します。たとえばformatDateTime('01/31/2016', 'dddd MMMM d', 'fr-fr')は'dimanche janvier 31'を返しますが、locale を省略した同じ式は'Sunday January 31'を返します。
戻り値は文字列です。これは実務で重要な点です。日付を書式設定すると、結果はテキストになります。そのため、書式設定した結果で日付の計算をしないでください。先に addDays や addToTime などの関数で計算し、書式設定は最後に行います。Power Automate では、書式設定済みの値は通常、メールの本文、ファイル名、テキスト列に入れるものです。
Power Automate で formatDateTime を使う手順
Microsoft の記事では、フローに式を挿入する明確な方法が紹介されています。
- 書式設定した値を入れたいアクションの入力欄を選択します。たとえば メールの送信 (V2) アクションの 本文 です。
- 動的なコンテンツの追加 を選択し、式 タブを開きます。フローデザイナーでは、fx ボタンとして表示されます。
formatDateTime(と入力するか、日付と時刻 の関数一覧から関数を探します。- 値を追加します。固定値を使う場合は一重引用符で囲んで入力するか、動的なコンテンツを選択します。動的なコンテンツは一重引用符で囲まないでください。
- 書式文字列を一重引用符で囲んで追加します。例:
'MM/dd/yyyy'。 - OK を選択して式を挿入します。
Microsoft のページにある例は次の形式です。引用符で囲んだ固定値の場合は formatDateTime('2023-10-22', 'dd/MM/yyyy hh:mm tt') となり、引用符で囲んだ値の代わりに動的なコンテンツを使う場合は、同じ呼び出しで引用符を付けずに記述します。
記事の実例では、手動でトリガーするフローと Date 入力を使っています。式は formatDateTime(triggerBody()?['date'], 'MM/dd/yyyy') です。日付が 2023-10-22 の場合、メールには MM/dd/yyyy の形式で日付が表示されます。
式を使ったフローを組む前に確認するには、一重引用符で囲んだ固定のタイムスタンプを指定した 作成 アクションを使い、フローを実行して実行履歴で出力を確認します。数分かかりますが、実際にメールを送信しているフローで書式の誤りを直す手間を省けます。
実際によく使う書式文字列
標準の書式文字列は 1 文字です。タイムスタンプ 2009-06-15T13:45:30 を使った Microsoft の例は次のとおりです。
'g'は6/15/2009 1:45 PMを返します。これは短い時刻を含む一般的な日時の形式です。'D'はMonday, June 15, 2009を返します。これは長い日付の形式です。
.NET のドキュメントには、ほかの標準の文字も掲載されています。同じタイムスタンプでの例は次のとおりです。'd' は 6/15/2009、't' は 1:45 PM、'T' は 1:45:30 PM、's' は並べ替え可能な 2009-06-15T13:45:30、'Y' は June 2009 を返します。多くはカルチャの規則に従うため、同じ文字でもロケールが違うと見た目が変わります。どの環境でも常に同じ見た目になるのは o、r、s、u です。
カスタム書式文字列を使うと、出力を細かく制御できます。フローで重要になる指定子は次のとおりです。
yyyyは 4 桁の年、yyは 2 桁の年です。MMは先頭にゼロを付けた月、MMMは月の短い名前、MMMMは月の完全な名前です。Mは先頭にゼロを付けない月です。ddは先頭にゼロを付けた日、dddは曜日の短い名前、ddddは曜日の完全な名前です。HHは先頭にゼロを付けた 24 時間制の時、hhは先頭にゼロを付けた 12 時間制の時です。mmは分、ssは秒、fffはミリ秒です。ttは AM または PM です。
この表に従うと、formatDateTime('2009-06-15T13:45:30', 'yyyy-MM-dd') は 2009-06-15 を返し、'hh:mm tt' は 01:45 PM を返します。Microsoft のフローの記事には、formatDateTime(utcNow(), 'MMMM dd, yyyy, HH:mm') という例も掲載されています。これは現在の UTC 日時を June 15, 2009, 16:50 の形式で返します。ここでは例として固定のサンプル日付を使っています。
.NETのルールに由来する癖が2つあります。1つ目は、1文字の書式指定子は常に標準の書式文字列として扱われることです。1文字のカスタム指定子を使いたい場合は、'%d'のようにパーセント記号を前に付けます。2つ目は、パターンに固定の文字列を挿入したい場合、その文字をバックスラッシュでエスケープするか、文字列を引用符で囲むことです。指定子ではないその他の文字は、そのまま出力にコピーされます。スラッシュとコロンはロケールの区切り記号に置き換えられるため、別のロケールを指定すると予期しない結果になることがあります。
タイムゾーン: 変換してから書式設定する
Power Automateでは既定でUTCが使われ、utcNow()は現在の日時をUTCで返します。ユーザーがベルリンやニューヨークにいる場合、先に変換しなければ、メール内の時刻はずれてしまいます。
Microsoftの記事では、両方の関数を組み合わせています: formatDateTime(convertTimeZone(utcNow(), 'UTC', 'Eastern Standard Time'), 'yyyy-MM-dd HH:mm:ss')。内側の関数でタイムゾーンを変換し、外側の関数で結果を書式設定します。タイムゾーン名はUTC、Pacific Standard Time、Eastern Standard TimeなどのWindowsの名前です。その他の地域では、Microsoftの一覧から対応するWindowsのタイムゾーン名を選んでください。
ワークフローのリファレンスにはconvertFromUtcも記載されています。この関数はUTCのタイムスタンプと変換先のタイムゾーンを受け取り、UTCオフセットを含まない変換後の時刻を返します。例は次のとおりです: convertFromUtc('2018-01-01T08:00:00.0000000Z', 'Pacific Standard Time')は"2018-01-01T00:00:00.0000000"を返します。逆方向の変換を行うconvertToUtcもあります。さらに、式ではなくアクションを使いたい場合は、Power AutomateにConvert time zoneアクションがあります。入力項目はBase time、Source time zone、Destination time zone、および任意のFormat stringです。
入力値が有効なISO 8601形式でない場合、「The date time string must match ISO8601 format.」のようなエラーが発生します。15/03/2018と入力された日付は典型的な原因です。ローカル形式で届く日付については、リファレンスにロケールと書式を指定するparseDateTimeが記載されています。例えばparseDateTime('21052019', 'fr-fr', 'ddMMyyyy')は'2019-05-21T00:00:00.0000000'を返します。まず解析し、その後に書式を設定してください。
よくある間違い
- 月に
mmを使う。小文字のmmは分、大文字のMMは月です。dd/mm/yyyyの形式で日付を書式設定すると、月を表示すべき位置に分が表示されてしまいます。 HHとttを組み合わせる。Microsoftの例である'M/dd/yyyy HH:mm:ss tt'は6/15/2009 13:45:30 PMを出力しますが、これは矛盾しています。ttと組み合わせる場合はhhを、組み合わせない場合はHHを使ってください。- 動的コンテンツを引用符で囲む。動的コンテンツに一重引用符を含めてはいけません。含めると、フローはその名前を単なるテキストとして扱います。
- タイムゾーンを忘れる。既定はUTCです。書式を設定する前に変換してください。
- 結果に対して計算を行う。出力は文字列です。計算は先に行い、書式設定は最後に行ってください。
utcNow()のサンプル出力をそのまま信頼する。ドキュメントの日付は固定の例です。実際の結果は現在の時刻を反映します。- ISO形式でない日付をそのまま渡す。先にロケールと書式を指定して解析してください。
あわせて確認したいトピック
- タイムゾーンの変換: タイムゾーンの変換に関するMicrosoftの記事では、アクションと式の両方を扱っています。
- 時刻の加算と減算:
addDaysとaddToTimeも同じ任意の書式を受け取るため、1回の呼び出しで値の変更と書式設定を行えます。 - ローカル日付形式の解析:
parseDateTimeは、ISO 8601形式で届かない日付のために、ロケールと書式を受け取ります。 - 関数の全一覧: ワークフロー式のリファレンスには、すべての日付と時刻の関数が記載されています。
- すべてのカスタム指定子については、カスタム日時書式指定文字列のページで、使用できるすべての文字を確認できます。
次のステップ
Power Automate の formatDateTime で確実に結果を得るには、ISO 8601 形式の日付から始め、書式設定の前にタイムゾーンを変換し、作成アクションでパターンをテストしてください。そのうえで、フローで日時の値をカスタマイズまたは書式設定する方法に関する Microsoft の記事を読み、チームがよく使うパターンを短いリストにまとめておくとよいでしょう。