先日のエントリでデータの画像のアーカイブを取るためにNode-RED
のfunctionノード
を使用してファイル名をYYYYMMDDhhmm.jpg
というような形式の文字列を作成していました。
参考
個人的には折角Node-RED
を使用しているので極力functionノード
は使用したくないものです。可読性などを高めるのであればfunctionノード
を用いたほうがフロー自体はスッキリしますが、コードをあまり書かなくても良いという利点があまり活かせないので可能な限り使わないで表現したいと常々思っています。
今回はわりと使用する頻度が高そうな日付時刻文字列を作る方法をまとめておこうと思います。今回のエントリーではfunctionノード
を使用しない方法も説明します。
functionノード
を使用するパターンmomentノード
を使用するパターンJSONata
を使用するパターン
functionノード
を使用するパターン
functionノード
のプロパティのコードにJavascript
のコードを記述していきますが、以下を参考にさせていただきました。
参考
基本的にはJavascript
のDateオブジェクト
の使用方法になるので、以下のようなコードを書いていくことになります。
注意があるとすれば月の数値コードでいうdate.getMonth()
は範囲が0から11になっているので数値化するときに1を加えている点でしょうか。
// ペイロードから日付オブジェクトを生成 let date = new Date(); //年・月・日を取得する let year = date.getFullYear(); let month = date.getMonth()+1; let day = date.getDate(); month = ("0" + month).slice(-2); day = ("0" + day).slice(-2); //時・分・秒を取得する let hour = date.getHours(); let minute = date.getMinutes(); let second = date.getSeconds(); hour = ("0" + hour).slice(-2); minute = ("0" + minute).slice(-2); second = ("0" + second).slice(-2); // 日付文字列に変換して再度ペイロードをセット msg.payload = year+month+day+"_"+hour+minute+second; // 次のノードへmsgオブジェクトを返す return msg;
それほど難しいコードではありませんが、正直スペルミスなども考えられるので折角のNode-RED
環境化ではあまり使いたくないです。
momentノード
を使用する
次に紹介するのは処理にmoment.js
を使用する拡張ノードmomentノード
を使用するパターンになります。
以下の拡張ノードを使用していきます。
通常の拡張ノードと同様に【三】→【パレットの管理】から【ノード追加】タブを選択してインストールを行います。
インストール後はパレットのformatsカテゴリ
に2つのノードが追加されます。
今回は2つうちDate/Time formatterノード
を使用します。
使用する拡張ノードの準備ができたので、injectノード
、Date/Time formatterノード
、debugノード
を使用して以下のようなフローを作成します。
Date/Time formatterノード
のプロパティは以下の様に設定をします。このノードはフォーマット変換をするだけのものになるため変換対象の日付時刻の取得は別途行う必要がある点が注意です(今回はinjectノード
で取得)。msg.payload
を入力として、日付時刻文字列の出力フォーマット、ロケール、タイムゾーンの設定をすることで、日付時刻文字列を取得することができます。
このフローを実行することで以下のような結果が得られます。
functionノード
よりも容易に結果を求めることができました。ロケールやタイムゾーンも変換できるのが利点かもしれません。
JSONata
を使用するパターン
次のやり方はJSONata
を使用しての日付時刻文字列の取得になります。先程は拡張ノードを別途インストールして行っていましたが、今回の方法はインストールするものは特にありません。
JSONata は、JSON データ構造を照会および変換するための式言語です。
ということなのですが、実はJSONata
には取得したデータを編集する機能が豊富に容易されています。
今回はその機能を使用するというものになります。
injectノード
、changeノード
、debugノード
を使用して以下のようなフローを作成します。
changeノード
のプロパティの設定で、ルールの設定で以下のように設定をします。
- 機能 … 【値の代入】
- 代入する変数 …
msg.payload
- 代入する値のフォーマット …
JSONata
- 代入する値 …
$fromMillis(payload,'[Y0001][M01][D01]_[H01][m01][s01]','+0900')
フォーマットの変更はプルダウンメニューから選択を行います。
代入する値で使用しているのは$fromMillis()
はミリ秒の値から日付時刻文字列を引数で指定した形式取得するものになります。
このフローをデプロイして実行すれば以下のように出力が行われます。
こちらも比較的簡単にかつデフォルトの機能だけで取得することができました。JSONata
は非常にたくさんの機能を持っているので使いこなせればfunctionノード
とほぼ同様のことができるようになるのではないかと感じます。
今回使用したフローGitHubにおいてありますので、テストなど使用してみてください。
おわりに
Node-RED
をつかって日付時刻文字列を取得するといった簡単な処理を調べてみました。functionノード
に逃げがちなところを拡張ノードに変える、JSONata
の利用に変えるなどいろいろやり方がありました。特に今回はJSONata
の使用方法がこんな方法もあるのかと驚きました。これまでJSONata
はJSON
から値を取得するクエリ的な位置づけでしか使ったことはなかったのですが、色々な用途がこれから見つけられそうです。
JSONata
については以下のものが参考になるかなと思います。
参考