Power Automate Desktopの変数（3）「Datetime型」

## 概要  

Power Automate Desktop(以下PAD) の変数についての記事3回目「Datetime型」です。PADのベース言語[Robinのドキュメント](https://robin-language.org/)を参考に試したものをまとめました。これまで「変数を設定する」アクション中心でしたがDatetime型に関しては日時に関するアクションを使用しています。後半は月末の求め方などのサンプルです。コードはPADにコピペで試せます。

## 目次

1. [概要、数値型](https://qiita.com/sys_zero/items/13e06a41834cf40988ea)
2. [テキスト型](https://qiita.com/sys_zero/items/0f5b54dd4dbbf0d31e71)
3. **[Datetime型](https://qiita.com/sys_zero/items/7804ffffea5b244c46c4)**<今回の記事>
4. [ブール型](https://qiita.com/sys_zero/items/68deda047c4b50c66458)
5. [リスト型](https://qiita.com/sys_zero/items/82951049466791b2b728)
6. [データテーブル型](https://qiita.com/sys_zero/items/171d73ba24e123dd1b66)
7. [カスタムオブジェクト型](https://qiita.com/sys_zero/items/6006ab42e2af60c170b5)

## 注意

- すでに使いこなしているかた向けの記事ではありません。
- RobinはPADのベースとなっていますが挙動が異なる部分があります。
- この記事の内容はすべて試していますが公式の見解とは異なる可能性がありますのでご注意ください。
- Power Automateクラウドフローの入出力変数については触れていません。
- 2021年2月の記事です。
- あくまでも個人のまとめです。
- 誤りがありましたらコメントでご指摘いただけると幸いです。
- Robinの公式サイトは2021年4月30日に終了しました。

## datetime型を扱うアクションと変数について  

datetime型変数はdatetime（日時データ）値を格納している変数です。
yyyy/MM/dd等に表記を変えたいときは「datetimeをテキストに変換」アクションを使います。
ただしテキスト値型になるため日時計算はできなくなります。

### 現在の時刻を取得します」アクション

変数名%CurrentDateTime%が作成され、システムの現在日時が格納されます。
![2021-02-13-22-05-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/9625533e-e608-bf39-d7b7-a0df77983120.png)

![2021-02-13-22-17-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/312b2487-2670-5f1b-6b94-6ecb72ea4564.png)

%CurrentDateTime%は以下のプロパティ値を持ちます。
![2021-02-13-22-16-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/8687f722-a797-c7fc-1419-5c5a71c0c8b7.png)


### 「変数を設定する」アクションで%CurrentDateTime%がもつ各プロパティ値を出力

#### 曜日はテキスト値

![2021-02-13-22-21-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/0b57fb22-dee5-ffcd-ab3b-8aa0b969ddfc.png)

![2021-02-13-22-22-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/17a0febb-95eb-28bf-8b6b-1be43b62bd46.png)


#### Year,Month,day,Hour,Minute,Secondは数値

![2021-02-14-00-44-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/8671558a-3b3f-1f19-ff52-e382bc8631f1.png)

![2021-02-14-00-44-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/d521d287-e558-5c60-c8ee-6574c75a4da8.png)


### 「変数を設定する」アクションから任意の日時を設定

![2021-02-13-22-55-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/2d1e522a-9cef-0ffb-26c4-adb9ec0240ee.png)


時間は省略して記入できますが、一度保存すると自動的に00：00：00が付与されます

![2021-02-13-22-56-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/9df1a49f-f7cd-41f6-0bf0-9d26be0e53ce.png)

![2021-02-13-22-56-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/e7a5d12e-c0c4-3b8b-a5e2-a8870c5122a6.png)


### 「日付の減算」アクション

2つの日時の差を求めることができます

![2021-02-13-22-57-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/4988418f-3f19-62b0-68c1-12c6e5390d0c.png)

![2021-02-13-22-57-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/e4ceda8e-b29c-7aea-e2ac-45478a123f86.png)


### 「加算する日時」アクション

各時間の単位でかdatetime値の加算ができます。
![2021-02-14-00-33-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/1b57c23e-3e63-f16d-002d-72fec65aa9a2.png)

![2021-02-14-00-35-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/447c76dd-31fe-054f-58e4-6785688ce3d0.png)


### 「datetimeをテキストに変更」アクション

datetime値の書式を変更します。
生成された変数の値はテキスト値です。
![2021-02-14-00-48-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/98127921-c35e-9c27-5e5e-bbecfbb456c5.png)

![2021-02-14-00-49-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/0f7d1324-9112-2e85-1d04-a8370b8f244d.png)

## Datetime型の応用編

### 当月月初を求める1

時刻まで考慮しない場合2アクションで可能です。
![2021-02-14-01-13-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/ff058e5e-1548-b197-75c4-90b2ad2974ed.png)

現在日時からCurrentDateTime.dayを引くと0日になり先月末になります。
あとは＋1日すれば月初になります。
![2021-02-14-01-14-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/8719ba1f-fb84-a174-1d0d-e016280e9fa2.png)

![2021-02-14-01-14-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/b3fa5216-937c-7b4b-819d-ba8ff82be91b.png)


```
DateTime.GetCurrentDateTime.Local DateTimeFormat: DateTime.DateTimeFormat.DateAndTime CurrentDateTime=> CurrentDateTime
DateTime.Add DateTime: CurrentDateTime TimeToAdd: -CurrentDateTime.Day + 1 TimeUnit: DateTime.TimeUnit.Days ResultedDate=> ResultedDate

```

### 当月月末を求める1

時刻まで考慮しないパターンです。
![2021-02-14-01-53-42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/796c5b43-ef5a-eafe-01af-7dbee712ff4f.png)

月初を求めたところからひと月進めて1日引く処理です。
前月末から+1月で良さそうなのですが、単純にMonthに+1されるだけなので例えば3月の場合、3月28日となってしまうためです。

```
DateTime.GetCurrentDateTime.Local DateTimeFormat: DateTime.DateTimeFormat.DateAndTime CurrentDateTime=> CurrentDateTime
DateTime.Add DateTime: CurrentDateTime TimeToAdd: -CurrentDateTime.Day + 1 TimeUnit: DateTime.TimeUnit.Days ResultedDate=> ResultedDate
DateTime.Add DateTime: ResultedDate TimeToAdd: 1 TimeUnit: DateTime.TimeUnit.Months ResultedDate=> ResultedDate2
DateTime.Add DateTime: ResultedDate2 TimeToAdd: -1 TimeUnit: DateTime.TimeUnit.Days ResultedDate=> ResultedDate3
```

### 当月月初を求める2 

現在日時のプロパティ値からYearとMonthを使い01日を結合したテキスト値を作成。
それをdatetime値にもどします。
![2021-02-14-18-33-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/01bee4a8-6c72-3af9-d9fb-1edd2bc6bea6.png)

![2021-02-14-18-34-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/15e39e93-9b72-f7b4-4d87-701ee628a84c.png)

月初1日0時00分00秒を得ることができます。
![2021-02-14-18-37-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/ee7f0103-d9a6-2601-e49f-8f572f3fffc5.png)


```
DateTime.GetCurrentDateTime.Local DateTimeFormat: DateTime.DateTimeFormat.DateAndTime CurrentDateTime=> CurrentDateTime
SET date TO $'''%CurrentDateTime.Year%/%CurrentDateTime.Month%/01'''
Text.ConvertTextToDateTime.ToDateTime Text: date DateTime=> TextAsDateTime
```

### 当月月末を求める2 

当月月初を求めてから一か月進めて1秒引きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/5a74af97-d136-1149-0253-45eb55494d19.png)



実行結果
月末23時59分59秒を求めることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/0b7d6203-847d-b6c0-5f64-b912b1caa082.png)


```
DateTime.GetCurrentDateTime.Local DateTimeFormat: DateTime.DateTimeFormat.DateAndTime CurrentDateTime=> CurrentDateTime
SET date TO $'''%CurrentDateTime.Year%/%CurrentDateTime.Month%/01'''
Text.ConvertTextToDateTime.ToDateTime Text: date DateTime=> TextAsDateTime
DateTime.Add DateTime: TextAsDateTime TimeToAdd: 1 TimeUnit: DateTime.TimeUnit.Months ResultedDate=> ResultedDate
DateTime.Add DateTime: ResultedDate TimeToAdd: -1 TimeUnit: DateTime.TimeUnit.Seconds ResultedDate=> ResultedDate2
```

どちらのパターンも「datetimeをテキストに変更」アクションを適用して、日付だけの形式にするなら結果は同じですが、時刻も含めて考慮するケースでは1つめのパターンは注意が必要です。

### 数値型の日付をdaitetime値に変更する

**「20210101」** のような数値型の日付をDatetime型の日時に変換します。
テキストのスライスを使った方法です。
![2021-02-14-18-09-42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/e12a534f-1772-64be-b25d-76829cf69568.png)

![2021-02-14-18-11-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/46f54637-c9af-3f09-be42-cc14dc9c691e.png)

実行結果
![2021-02-14-18-10-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/4302668a-b53f-05f5-34b0-99cd96ad804e.png)


```
SET NumDate TO 20210214
Text.FromNumber Number: NumDate DecimalPlaces: 0 UseThousandsSeparator: False FormattedNumber=> NumDateText
Text.ConvertTextToDateTime.ToDateTime Text: $'''%NumDateText[:4]%/%NumDateText[4:6]%/%NumDateText[6:]%''' DateTime=> TextAsDateTime
```

### 週末を考慮した月末稼働日

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/38608fa5-1668-3f59-371a-a09c93bccfd0.png)



実行結果
![](2021-02-16-18-43-40.png)![2021-02-16-18-43-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/2a7046cc-9e65-79b7-8c76-b1852ef64e2f.png)
今月は26日が月末稼働日！厳しい(;'∀')

```
DateTime.GetCurrentDateTime.Local DateTimeFormat: DateTime.DateTimeFormat.DateAndTime CurrentDateTime=> CurrentDateTime
SET date TO $'''%CurrentDateTime.Year%/%CurrentDateTime.Month%/01'''
Text.ConvertTextToDateTime.ToDateTime Text: date DateTime=> TextAsDateTime
DateTime.Add DateTime: TextAsDateTime TimeToAdd: 1 TimeUnit: DateTime.TimeUnit.Months ResultedDate=> ResultedDate
DateTime.Add DateTime: ResultedDate TimeToAdd: -1 TimeUnit: DateTime.TimeUnit.Seconds ResultedDate=> ResultedDate2
SET WeekofDay TO ResultedDate2.DayOfWeek
SWITCH WeekofDay
    CASE = $'''Sunday'''
        DateTime.Add DateTime: ResultedDate2 TimeToAdd: -2 TimeUnit: DateTime.TimeUnit.Days ResultedDate=> ResultedDate3
    CASE = $'''Saturday'''
        DateTime.Add DateTime: ResultedDate2 TimeToAdd: -1 TimeUnit: DateTime.TimeUnit.Days ResultedDate=> ResultedDate3
    DEFAULT
        SET ResultedDate3 TO ResultedDate2
END
```

## 今回のまとめ  

型を意識しないとエラーがでやすいです。

地味ですがまだまだ続きます。(;'∀')

## 参考
[Robin - RPA language](https://robin-language.org/)
[Power Automate Desktop の変数の処理 - Learn - Microsoft Docs](https://docs.microsoft.com/ja-jp/learn/modules/pad-variables/)