【Power Automate】頻出する日時処理まとめ

## はじめに
とある社内システムの開発にあたりさまざまな日時パターンのに遭遇したので、備忘録としてその取得、処理方法について整理しておきます。

## 現在日時の取得
### ① アクション：現在の時刻

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/20502808-de0b-18c7-31dc-c2a3a07e2f0a.png)

実行結果：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/fc4b87f6-d43f-0b7d-465a-5adc96005a71.png)


### ② 関数：utcNow
``` :式
utcNow()
```
``` :実行結果
2024-04-16T06:57:51.3035667Z
```

``` :式
utcNow('yyyy-MM-dd')
```
``` :実行結果
2024-04-16
```
::: note warn
utcNowで取得される日時はUTC（協定世界時）なので、JST（日本標準時 UTC+9時間）に変換する必要があります。
:::

## タイムゾーンの変換
### ① アクション：タイムゾーンの変換

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/09c0abb4-6948-7a2e-b6bf-d86125e15a55.png)


実行結果：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/c4901210-1667-54c7-4efd-bb40651b7844.png)

### ② 関数：convertFromUTC
``` :式
convertTimeZone(utcNow(),'Tokyo Standard Time','yyyy-MM-ddTHH:mm:ss')
```

``` :実行結果
2024-04-16T15:57:51
```

::: note info
2つのタイムゾーンの差がわかっている場合は、単純な時間の足し算でタイムゾーンを変換することもできます。
:::

### ③ アクション：時間への追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/514cc091-43f3-504d-2999-503f42b9db32.png)

実行結果：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/f5a78440-38fa-baa8-baee-c36dabf8be55.png)


### ④ 関数：addHours
``` :式
addHour(utcNow(),9,'yyyy-MM-ddTHH:mm:ss')
```
``` :実行結果
2024-04-16T15:57:51
```

::: note warn
Dataverse はUTCで保存されるため、JSTに変換する必要はありません。
:::

https://qiita.com/annap_ms/items/fb5fcb04e1216a0de7d4

## フォーマットの変更
### ① 関数：formatDateTime
``` :式
formatDateTime('2024-04-16T15:57:51','yyyy年MM月dd日HH時')
```
``` :実行結果
2024年04月16日15時
```

``` :式
formatDateTime('2024-04-16T06:57:51Z','yyyy/MM/dd hh:mm')
```
``` :実行結果
2024/04/12 06:57
```

:::note info
MM（大文字）は月（Month）、mm（小文字）は分（minute）を表します。
HH（大文字）は24時間表記、hh（小文字は）12時間表記を表します。

その他のカスタム形式はこちらの公式ドキュメントを参照ください。
https://learn.microsoft.com/ja-jp/office/vba/api/access.format.propertydate.time#custom-formats
:::

## 月初日の取得
### ① 現在の日時から取得
``` :式
utcNow('yyyy-MM-01')
```
``` :実行結果
2024-04-01
```

### ② 特定の日時から取得
``` :式
formatDateTime('2024-04-16','yyyy-MM-01')
```
``` :実行結果
2024-04-01
```
## 月末日の取得

月初日の取得 → 翌月初日の取得（+1カ月）→ 月末日の取得（-1日）で取得します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/6d2e8250-f35e-e94d-8d15-79309277ac94.png)


``` :時間への追加：式
utcNow('yyyy-MM-01')
```
``` :作成：式
addDays(body('時間への追加'),-1,'yyyy-MM-dd')
```
実行結果：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/51524b33-95d5-07df-432d-7e6d49d2085f.png)

::: note info
「間隔」を12に変更することで、1年後の末日を取得することができます。また、「基準時間」を現在日時にすることで、単純な1カ月後、1年後の日時を取得することができます。
:::

**※ 補足1：うるう年（4の倍数）の場合**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/f2757fdc-e436-3c06-da29-1c73dd48508f.png)

**※ 補足2：うるう年（100の倍数）の場合**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478860/eef305cb-afd1-5f5f-c43c-f88c4114648f.png)


::: note info
うるう年の場合も同様の処理で取得できます。
:::

## UNIXタイムスタンプ ↔ 日時 の変換
### ① UNIXタイムスタンプ（秒） → 日時（JST）
``` :式
addHours(addseconds('1970-1-1',1712923519),9,'yyyy-MM-ddTHH:mm:ssZ')
```
``` :実行結果
2024-04-12T21:05:19Z
```

::: note info
UNIXタイムスタンプとは、1970年1月1日0時0分0秒（UTC）からの経過秒数で表される時間です。
:::

### ② 日時（JST） → UNIXタイムスタンプ（秒）
``` :式
div(sub(ticks(addHours('2024-04-12T21:05:19Z',-9),ticks('1970-1-1')),10000000)
```
``` :実行結果
1712923519
```

::: note info
ticks関数は、0001年1月1日0時0分0秒（UTC）から指定した日時までのティック数（10,000,000ティック=1秒）を返します。そのため、特定の日時（UTC）のティック数と1970年1月1日0時0分0秒（UTC）のティック数の差分をとってから10,000,000で割ることで、UNIXタイムスタンプ（秒）が得られます。
:::

## おわりに
この記事では、個人的によく使用するさまざまな日時パターンの取得と処理についてまとめました。一部の日時操作はアクションや関数の使用にさまざまな選択肢がありますが、個人的には式で書ける「関数」、汎用的に利用できる「アクション：時間への追加」を多用しています。

今回が初めてのQiita投稿になりますが、今後も継続的にPowerPlatformに関するお役立ち情報を発信していきますので、どうぞよろしくお願いします。