IFTTT で使われるアメリカ式の月を名前で書く日時表記を JavaScript で ISO 8601 的な日付に変換するメモです。
こんなシチュエーション
ちょうど IFTTT で使われる日時表記が March 29, 2021 at 03:45PM
で、AirTable の日付扱いのセルに API 経由でデータを入れようとしたところ、 ISO 8601 な表記じゃないよと弾かれてしまったので、ちゃんと直します。
【完全保存版】英語の正式な日付表記はこの3種類! | マミーの気ままに実践英語
ここを見る通りで、アメリカ式やイギリス式といろいろとあるんですね。March 29, 2021 at 03:45PM
は、Marchが月の名前でだし、AM/PMもあって、数値の変換だけで変換がサクッといかない感じが悩ましい。
とにもかくにも、
にあるように 2021-03-29T15:45:00+09:00
といった表記に変えてみます。
ソースコード
実際には Node-RED の function ノードの中で使っていますが、単体で使えるように加工しています。
// 英語表記の日付のリスト const enMonthName = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ]; // IFTTT の Twitter トリガーからもらう CreatedAt の表記 // March 29, 2021 at 03:45PM const iftttTimeCreatedAt = "March 29, 2021 at 03:45PM"; // 日時を配列に分離 const createdAtList = iftttTimeCreatedAt.split(",").join("").split(" "); // 0: March // 1: 29 // 2: 2021 // 3: at // 4: 03:45PM // 英語表記を数字に変換 let month = createdAtList[0]; month = enMonthName.indexOf(month) + 1; let day = Number(createdAtList[1]); let year = Number(createdAtList[2]); // 時分で分ける let time = createdAtList[4]; timeList = time.substr(0,5).split(":"); let hour = Number(timeList[0]); let minute = Number(timeList[1]); // AM/PM 取得 let AM_PM = time.substr(5,2); if(AM_PM == "PM"){ hour += 12; } // 2桁0で埋める処理 month = String( 100 + month ).substr(1,2); day = String( 100 + day ).substr(1,2); hour = String( 100 + hour ).substr(1,2); minute = String( 100 + minute ).substr(1,2); // 結合 const convertedDateText = year + "-" + month + "-" + day + "T" + hour + ":" + minute + ":00+09:00"; // 2021-03-29T15:45:00+09:00 console.log(convertedDateText);
substr な文字列処理を使っていたり 2桁を 0 で埋める処理とか、いろいろ愚直にやっています。
アメリカ式の日時とは言いましたが IFTTT がこのような形式で出しているだけで、そういっていいのかちょっと分かりませんが、とりあえず動くからよしとします。