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もあって、数値の変換だけで変換がサクッといかない感じが悩ましい。

とにもかくにも、

ISO 8601 – Wikipedia

にあるように 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 がこのような形式で出しているだけで、そういっていいのかちょっと分かりませんが、とりあえず動くからよしとします。