IFTTT で使われるアメリカ式の月を名前で書く日時表記を JavaScript で ISO 8601 的な日付に変換するメモ
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 がこのような形式で出しているだけで、そういっていいのかちょっと分かりませんが、とりあえず動くからよしとします。