Power Automate 小技 日付を切り上げるフロー #日付01

# はじめに
忙しさにかまけて、Qiitaからの発信をさぼりそうなので、
しょっちゅう忘れる`Power Automate`の関数の備忘録をストックしていこうと思います。

今回のテーマは、現在日時から見た`直近の日付の算出`です。

- 現在の日付から繰り上げて直近の1日または20日を取得する

このような機能をストックします。ショートブログです。

:::note info
しょっちゅう自分自身忘れるので後で見返せるように！
:::

# フローの内容

## 全体像

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/89df31eb-90ba-82b7-52b9-9dc628ed02e9.png)

::: note info
規模が大きめの仕組みで使う場合は、子フローにすることをお勧めします。
:::


`インスタント クラウド フロー`で作成します。

1. 変数を初期化する
    - `japanNow`という`文字列変数`をセットします。
        - この記事では、なるべく`アクション`を使いません。
        - [convertTimeZone関数についてはこちら！](https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#convertTimeZone)
        - [タイムゾーン表記の参考](https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/default-time-zones?view=windows-11)
        - 個人的にアクションが羅列することを嫌うからです。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/b7e31f39-82f0-dd6a-fce5-b4121da27fec.png)
        ```planetext:式
        convertTimeZone(utcNow(),'UTC','Tokyo Standard Time')
        ```
    :::note info
    上記で`現在の時刻を取得する`と`タイム ゾーンを変換する`の二点を達成しています
    :::
    
2. 変数を初期化する
    - `date`という`文字列変数`をセットします。
        - 後ほど**条件によって変動する文字列タイムスタンプ** を格納するためです。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/76929f87-5454-79ff-ef5f-3dbf5d4d2f21.png)

3. 条件分岐
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/468fc0d5-222e-4bee-adcc-d2389e69f364.png)
    - `dayOfMonth()関数`によって、変数`japanNow`の**日付部分**を抽出しています。
        - 似たような名前の関数があるので要注意です。
    - `~ is less than XX` は、XXより小さい、を表します。ここら辺の条件は臨機応変に。
    
1. **(3-1) 20日より日付が小さい場合**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/5d977471-9567-4c8a-c538-cd3668fe7a15.png)
```planetext:式
addDays(startOfMonth(variables('japanNow'),19)
```
1. 一度取得した現在日付の属する月の月初のタイムスタンプを取得します
1. 取得したタイムスタンプから[addDays()関数](https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#addDays)を使い、19日加算します

https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#addDays


::: note warn
私見ですが、厳密にタイムゾーンを加味するとなると、一度タイムゾーンを日本に直してから変換した関数がエラーが起きにくいように想像しました。[getFutureTime関数](https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#getFutureTime)もありますが、TimeStampを引数に設定できないことだけが不安に感じます。
:::

https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#getFutureTime

5. **(3-2) 20日より日付が大きい場合**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/afcca674-5884-e56e-458b-6006df90d582.png)
```planetext:式
addToTime(startOfMonth(variables('japanNow')),1,'Month')
```
1. 一度取得した現在日付の属する月の月初のタイムスタンプを取得します
1. 取得したタイムスタンプから[addToTime()関数](https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#addToTime)を使い、1月加算します

https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#addToTime


::: note info
標準で時間の加算が備わっているのは`Days`、`Hours`、`Minutes`、`Seconds`。
そのほかは`ToTime`で加算します。
:::


# テスト
 - 2024.01.04 19:10(2024-01-04T19:10:24.2415968)に試す
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/6086a0a5-fb7f-b2fc-93a6-1be0d81f6826.png)
 - タイムスタンプ(2024-01-30T13:45:30.1510184)で試す
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/b1ee463e-1e66-e3e7-0fac-cfaa74269786.png)

子フローで出番がチョコチョコありそうです。
**日付関数は自動化で押さえなきゃいけない必修事項！**

**活用してGood Power Lifeを！**
See you next time♪