【Power Automate】日時を扱う際のタイムゾーン変換


ほとんど公式リファレンスの焼きましだけど「で、日本だとどうなるの？」を都度忘れるので

## 基礎知識
Microsoft Flowでは基本的に協定世界時(UTC)で処理を行う
日本標準時(UTC+0900)のままで使おうとするとズレが発生する

## フォーマット
### 協定世界時
`yyyy-mm-ddThh:mm:ssZ`
モバイルのFlowボタンのタイムスタンプ
utcNow()で取得できる日付時刻等はこの書式

例
2018年9月13日　9時42分19秒(JST)
↓
2018-09-13T00:42:19Z

### ローカル時刻
`yyyy-mm-ddThh:mm:ss`
協定世界時からZを外しただけ
現在どこのタイムゾーンになっているかは保持していない(と思う)

例
2018年9月13日　9時42分19秒(JST)
↓
2018-09-13T09:42:19

## 関連する関数(抜粋)
より詳しい内容は[公式リファレンス](https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference)を参照


### [utcNow(Optional format)](https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#utcNow)
現在のタイムスタンプを返す

- format : 日付フォーマット  
ほとんど変更しないので説明は割愛

例
2018年9月13日　9時42分19秒(JST)
↓
2018-09-13T00:42:19Z

### [convertTimeZone(timestamp, sourceTimeZone, destinationTimeZone, Optional format)](https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#convertTimeZone)
タイムスタンプをタイムゾーン変換する
変換する元/先がUTCなら後述のconvertFromUtcかconvertToUtcを使用する

- timestamp : 対象のタイムスタンプ
- sourceTimeZone : 変換元となるタイムゾーン
    - `'UTC'` 協定世界時
    - `'Tokyo Standard Time'` 日本標準時
    - その他は[リファレンス](https://support.microsoft.com/en-us/help/973627/microsoft-time-zone-index-values)参照
- destinationTimeZone : 変換先となるタイムゾーン
    - `'UTC'` 協定世界時
    - `'Tokyo Standard Time'` 日本標準時
    - その他は[リファレンス](https://support.microsoft.com/en-us/help/973627/microsoft-time-zone-index-values)参照
- format : 日付フォーマット  
ほとんど変更しない  
変更する場合は[リファレンス](https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/standard-date-and-time-format-strings)参照

例
2018年9月13日　9時42分19秒(JST)

2018-09-13T00:42:19Z
↓`convertTimeZone(2018-09-13T00:42:19Z, 'UTC', 'Tokyo Standard Time')`
2018-09-13T09:42:19

### [convertFromUtc(timestamp, destinationTimeZone, Optional format)](https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#convertFromUtc)
タイムスタンプをUTCから指定のタイムゾーンに変換する

- timestamp : 対象のタイムスタンプ
- destinationTimeZone : 変換先となるタイムゾーン
    - `'Tokyo Standard Time'` 日本標準時
    - その他は[リファレンス](https://support.microsoft.com/en-us/help/973627/microsoft-time-zone-index-values)参照
- format : 日付フォーマット  
ほとんど変更しない  
変更する場合は[リファレンス](https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/standard-date-and-time-format-strings)参照

例
2018年9月13日　9時42分19秒(JST)

2018-09-13T09:42:19
↓`convertFromUtc(2018-09-13T09:42:19, 'Tokyo Standard Time')`
2018-09-13T00:42:19Z

### [convertToUtc(timestamp, sourceTimeZone, Optional format)](https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#convertToUtc)
タイムスタンプを指定のタイムゾーンからUTCに変換する

- timestamp : 対象のタイムスタンプ
- sourceTimeZone : 変換元となるタイムゾーン
    - `'Tokyo Standard Time'` 日本標準時
    - その他は[リファレンス](https://support.microsoft.com/en-us/help/973627/microsoft-time-zone-index-values)参照
- format : 日付フォーマット  
ほとんど変更しない  
変更する場合は[リファレンス](https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/standard-date-and-time-format-strings)参照

例
2018年9月13日　9時42分19秒(JST)

2018-09-13T00:42:19Z
↓`convertToUtc(2018-09-13T00:42:19Z, 'Tokyo Standard Time')`
2018-09-13T09:42:19

### [formatDateTime(timestamp, Optional format, Optional locale)](https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#formatDateTime)
日付時刻を指定のフォーマットで出力する
- 年　y(2), yy(22), yyyy(2022)
- 月　M(9), MM(09)
- 日　d(5), dd(05)
- 曜日　ddd(月), dddd(月曜日)
- 時間　h(4), hh(04), H(16), HH(16)
- 分　m(7), mm(07)
- 秒　s(5), ss(05)

例
2018年9月13日　9時42分19秒(JST)

2018-09-13T09:42:19Z
↓`formatDateTime(2018-09-13T09:42:19Z, 'yyyy/MM/dd HH:mm:ss')`
2018/09/13 09:42:19


## 使用例
### 現在の日時(JST)を取得する
convertFromUtc(utcNow(), 'Tokyo Standard Time')