﻿# 整理幾個 Azure Logic Apps 與 Power Automate 會用到的日期函式

最近熱愛 `low-code` 或 `no-code` 的解決方案，簡單拖拉幾個設定，或是複製之前寫好的 JSON，就可以快速完成一個日常的自動化工作，減少越來越多的人工操作，重點是幾乎不用花錢，也不用花心思在部署上。今天我要來整理幾個 [Azure Logic Apps](https://learn.microsoft.com/en-us/azure/logic-apps/logic-apps-overview) 與 [Power Automate](https://learn.microsoft.com/en-us/flow/getting-started) 會用到的日期函數，因為我的自動化工作大多都跟日期時間有點關係。

> Azure Logic App 的 [Consumption Plan](https://azure.microsoft.com/zh-tw/pricing/details/logic-apps/?WT.mc_id=DT-MVP-4015686#pricing) 每個月有 4,000 次觸發動作是完全免費的！

### 基本「日期」觀念

其實在 [Azure Logic Apps](https://learn.microsoft.com/en-us/azure/logic-apps/logic-apps-overview) 與 [Power Automate](https://learn.microsoft.com/en-us/flow/getting-started) 裡面並沒有「日期」型別，所有的 `timestamp` 都是以 [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) 的「字串」來表示。

-   表達一份 UTC 日期時間格式
    
    ```bash
    2021-07-04T03:30:08.9644580Z
    ```
    
    > 日期與時間之間會有個 `T` 字元，結尾有個 `Z` 字元，就代表這是一個 UTC 時間！
    
-   轉換一份無法判斷的日期時間格式
    
    如果你有個字串為 `10212011`，雖然人眼看的出是 `月日年` (`MMddyyyy`)，但是系統卻無法正確解析，此時就可以利用字串串接的技巧，重新格式化成看的懂的格式 (`MM-dd-yyyy`)，再透過 [formatDateTime](https://learn.microsoft.com/en-us/azure/logic-apps/workflow-definition-language-functions-reference#formatDateTime) 轉換成你想要轉換過去的格式 (`yyyy-MM-dd`)。
    
    ```javascript
    formatDateTime(concat(substring('10212011', 0,2), '-', substring('10212011', 2,2), '-', substring('10212011', 4,4)), 'yyyy-MM-dd')
    ```
    
    > 注意：如果 [formatDateTime](https://learn.microsoft.com/en-us/azure/logic-apps/workflow-definition-language-functions-reference#formatDateTime) 函式沒有加上第二個 `format` 參數，預設輸出的格式為 `yyyy-MM-ddTHH:mm:ss.fffffffK`！
    
-   轉換一份 Epoch time ([Unix time](https://en.wikipedia.org/wiki/Unix_time)) 時間為 `timestamp`
    
    Epoch 時間又稱 Unix time，一般來說都是以 **UTC** 時間來計算的，而且都是從 `1970-01-01T00:00:00Z` 到現在時間的 Seconds (秒數)！
    
    所以你可以用 [addSeconds](https://learn.microsoft.com/en-us/azure/logic-apps/workflow-definition-language-functions-reference#addSeconds) 函式來將一個數值轉換成 `timestamp` 格式：
    
    ```javascript
    addSeconds('1970-01-01T00:00:00Z', 1625384178)
    ```
    
    偶爾會有人將 Epoch time 改用 Milliseconds (豪秒) 單位，這時就要記得先除以 `1000` 才能進行轉換：
    
    ```javascript
    addSeconds('1970-01-01T00:00:00Z', div(1625384178964, 1000))
    ```
    
    > 這裡有個好用的 [Epoch & Unix Timestamp Conversion Tools](https://www.epochconverter.com/) 可以幫你轉換 Epoch 時間格式。另外，如果你想在 Linux 環境下快速取得當下的 Epoch 時間，可以使用 `date +%s` (秒) 或 `date +%s%3N` (豪秒) 命令！
    

### 常見的日期函式

-   取得 UTC 當前時間
    
    ```javascript
    utcNow()
    ```
    
    ```
    2021-07-04T03:30:08.9644580Z
    ```
    
-   取得**台北標準時間**的**當前時間**
    
    ```javascript
    convertFromUtc(utcNow(), 'Taipei Standard Time')
    ```
    
    ```
    2021-07-04T11:30:08.9644580
    ```
    
-   指定輸出特定日期時間格式（**台北標準時間**）- 日期部分
    
    ```javascript
    formatDateTime(convertFromUtc(utcNow(), 'Taipei Standard Time'), 'yyyy-MM-dd')
    ```
    
    ```
    2021-07-04
    ```
    
    > 自訂日期格式的語法詳見 [Custom date and time format strings](https://learn.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings) 文件。
    
-   指定輸出特定日期時間格式（**台北標準時間**）- 時間部分
    
    ```javascript
    formatDateTime(convertFromUtc(utcNow(), 'Taipei Standard Time'), 'hh:mm:ss')
    ```
    
    ```
    11:30:08
    ```
    
-   取得今天星期幾（**台北標準時間**）
    
    ```javascript
    dayOfWeek(convertFromUtc(utcNow(), 'Taipei Standard Time'))
    ```
    
    ```
    0
    ```
    
    > 注意：**星期天**為 `0`，**星期一**為 `1`，依此類推，**星期六**為 `6`！
    
-   取得當月的第一天 (**台北標準時間**）
    
    ```javascript
    formatDateTime(startOfMonth(convertFromUtc(utcNow(), 'Taipei Standard Time')), 'yyyy-MM-dd')
    ```
    
    ```
    2021-07-01
    ```
    
-   取得次月的第一天 (**台北標準時間**）
    
    ```javascript
    formatDateTime(startOfMonth(addToTime(convertFromUtc(utcNow(), 'Taipei Standard Time'), 1, 'month')), 'yyyy-MM-dd')
    ```
    
    ```
    2021-08-01
    ```
    
-   取得當月的最後一天 (**台北標準時間**）
    
    ```javascript
    formatDateTime(subtractFromTime(startOfMonth(addToTime(convertFromUtc(utcNow(), 'Taipei Standard Time'), 1, 'month')), 1, 'second'), 'yyyy-MM-dd')
    ```
    
    ```
    2021-07-31
    ```
    

### 相關連結

-   [Reference guide to using functions in expressions for Azure Logic Apps and Power Automate](https://learn.microsoft.com/en-us/azure/logic-apps/workflow-definition-language-functions-reference)
    -   [Standard date and time format strings](https://learn.microsoft.com/en-us/dotnet/standard/base-types/standard-date-and-time-format-strings?WT.mc_id=DT-MVP-4015686)
    -   [Custom date and time format strings](https://learn.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings?WT.mc_id=DT-MVP-4015686)
-   [Converting Tick or Epoch to Timestamp in Logic App | DevKimchi](https://devkimchi.com/2018/11/04/converting-tick-or-epoch-to-timestamp-in-logic-app/)
-   [Epoch Converter - Unix Timestamp Converter](https://www.epochconverter.com/)
