Power Automateで日付データ、特にutcNow関数を使用する際、正しく日本時間に変換されないケースがしばしばあります。このブログでは、そのような場合の確認方法と最終的にどの構文が正しいかを紹介していきます。
※今回の文章はすべてCopilotに修正してもらってます。
formatDateTime関数を使っている場合
エラーとならない設定
次のようなロケールを設定していませんか?
formatDateTime(utcNow(), 'yyyy-MM-dd HH:mm:ss', 'ja-jp')
formatDateTime(utcNow(), 'yyyy-MM-dd HH:mm:ss', 'JP')
実際には、formatDateTime関数でロケールを指定しても、正しく機能しないことが多いと考えられます。特に日本のロケールには対応していないようで、エラーは発生しないものの適切に変換されないことがあります。エラーが発生しないため、Copilotも警告や修正案を提供することはありません。
エラーとなる設定
次のようなロケールはエラーとなりますが修正には注意が必要です。
formatDateTime(utcNow(), 'yyyy-MM-dd HH:mm:ss', 'Tokyo Standard Time')
formatDateTime(utcNow(), 'yyyy-MM-dd HH:mm:ss', 'Asia/Tokyo')
「Tokyo Standard Time」と指定した場合、Copilotは「Asia/Tokyo」の使用を指示します。その後、「Asia/Tokyo」を設定すると、次に「en-us」のような一般的なロケールを指定するよう指示されます。
‘ja-jp’を指定してもエラーにならないことはご存知かもしれませんが、時間の補正は正しく行われません。
addHours関数で補正後formatDateTimeで書式設定を行う
日本の標準時はUTCに9時間を加えたものです。そのため、addHours()関数を使用して9時間を事前に加算し、formatDateTime()関数でフォーマットを設定することで、正確な日本時間を取得することができます。
formatDateTime(addHours(utcNow(), 9), 'yyyy-MM-dd HH:mm:ss')
convertTimeZone関数を使っている場合
convertTimeZone関数の場合はCopilotが適正な修正方法を提示してくれますのでエラー判定が容易です。
エラーとならない設定
convertTimeZone(utcNow(), 'UTC', 'Asia/Tokyo')
convertTimeZone(utcNow(), 'UTC', 'Tokyo Standard Time')
どちらも”yyyy-MM-ddTHH:mm:ss.z”の形式で補正されます。
エラーとなる設定
convertTimeZone(utcNow(), 'UTC', 'ja-jp)
convertTimeZone(utcNow(), 'UTC', 'JP')
「ja-jp」と指定した場合、Copilotは「Asia/Tokyo」の使用を指示します。
「JP」を設定すると、Copilotは「Tokyo Standard Time」の使用を指示します。
convertFromUtc関数を使っている場合
エラーとならない設定
convertFromUtc(utcNow(), 'Tokyo Standard Time', 'yyyy-MM-dd HH:mm:ss')
convertFromUtc(utcNow(), 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss')
convertFromUtc関数は、utcTimeを基準にしてローカル時間に変換する機能を持っています。さらに、書式指定が可能なため、utcNowを現地時間に変換する際には最適な結果を提供します。そのため、私はこれを最も使いやすい関数だと考えています。
エラーとなる設定
次のようなロケール設定はエラーになりますが、Copilotは正しい修正方法を提案してくれます。
convertFromUtc(utcNow(), 'ja-jp', 'yyyy-MM-dd HH:mm:ss')
convertFromUtc(utcNow(), 'JP', 'yyyy-MM-dd HH:mm:ss')
「ja-jp」と指定した場合、Copilotは「Tokyo Standard Time」の使用を指示します。
「JP」を設定した場合もCopilotは「Tokyo Standard Time」の使用を指示します。
ケース別設定
UTCを日本時間に変換できる関数は大きく分けて2通り計3個の関数があることが解りました。
タイムスタンプが必要な場合
タイムスタンプを返す関数には、UTCからの時差がわかっている場合に使用できるAddHours関数と、タイムゾーンを変換できるConvertTimeZone関数の2つがあります。
/* 第一引数には基準となるUTCTimeStanp、第二引数には時差 */
AddHours(utcNow(), 9)
/* 第一引数には基準となるUTCTimeStanp、第二引数には世界標準時間を示すロケール文字列"UTC"、第三引数には日本標準時間を示す"Tokyo Standard Time" */
ConvertTimeZone(utcNow(), "UTC", "Tokyo Standard Time")
書式設定された文字列が必要な場合
日付形式の値を書式設定するための関数には2つあります。一つ目は日付形式の値を受け取って書式設定を行うFormatDateTime関数、もう一つはUTC時間を基準としてローカル時間へ変換するConvertFromUtc関数です。
/* 変換後のタイムスタンプを書式設定 */
formatDateTime(AddHours(utcNow(), 9), 'yyyy-MM-dd HH:mm:ss')
formatDateTime(ConvertTimeZone(utcNow(), "UTC", "Tokyo Standard Time"), 'yyyy-MM-dd HH:mm:ss')
/* 変換と同時に書式設定 */
ConvertFromUtc(utcNow(), 'Tokyo Standatd Time', 'yyyy-MM-dd HH:mm:ss')
ロケール文字列として「Tokyo Standard Time」を指定することを推奨します。これにより、formatDateTime関数を設定する際のエラーを防ぎ、設定ミスを避けることができます。また、Power Automateでロケールを設定する際には、標準時間の文字列を使用する習慣を身につけることができます。