🕰️

「今夜」「令和元年」「4 PM」様々な日時をパースできるNode.jsパッケージ"chrono"の紹介

に公開

「昨日」「今夜」「令和元年5月1日」「12月31日」「1996年5月3日」「2025/4/1(火)10:00」
「Friday at 4pm」「June 10th, 2018」「6/10/2018」「tomorrow from 10 to 11 AM」

一定のフォーマットに沿っていない日付のテキストをDate型にパースしたいことはありませんか?

上記のような自然言語の日時をパースするchrono というNode.jsパッケージを紹介します。
https://github.com/wanasit/chrono
https://www.npmjs.com/package/chrono-node

前提条件

今回、動作確認した環境は、以下の通りです。

項目 バージョン
Windows11 24H2
Node.js 18.19.0
npm 10.2.3
chrono-node 2.8.2

また、動作確認した日付は2025年4月6日で、システムのタイムゾーンはJSTです。

英語

chronoのデフォルトの言語は英語であり、英語の機能が最も充実しています。

const chrono = require('chrono-node');

chrono.parseDate('6/10/2018');
// June 10th, 2018
chrono.parseDate('next Friday at 4pm')
// 2025-04-11T07:00:00.000Z


日付の開始と終了をパースすることも可能です。

const chrono = require('chrono-node');

const results = chrono.parse('I have an appointment July 1st from 10 to 11 AM');

results[0].index;     // 22
results[0].text;      // 'July 1st from 10 to 11 AM'
results[0].refDate;   // 現在時刻

results[0].start.date();  // Mon Jul 1 2025 10:00:00 GMT+0900 (JST)
results[0].end.date();    // Mon Jul 1 2025 11:00:00 GMT+0900 (JST)

日本語

日本語でも、日付と時間をパースできます。

const chrono = require('chrono-node');

chrono.ja.parseDate('明日はある')
// 2025-04-07T07:37:35.814Z
chrono.ja.parseDate("今夜は火星がとても明るい")
// 2025-04-06T13:00:00.000Z (JSTの22:00)

chrono.ja.parseDate('昭和64年1月7日です');
// 1989-01-07T03:00:00.000Z (JSTの正午)
chrono.ja.parseDate('令和元年5月1日');
// 2019-05-01T03:00:00.000Z (JSTの正午)

chrono.ja.parseDate('2000年1月1日は来るのか'); // 全角数字
// 2000-01-01T03:00:00.000Z (JSTの正午)

chrono.ja.parseDate('2014年3月5日午後6時半');
// 2014-03-05T09:30:00.000Z (JSTの18:30)


日付の開始と終了をパースすることも可能です。

const chrono = require('chrono-node');

result = chrono.ja.parse('2025/4/1(火) 9:00 ~ 2025/4/2(水) 17:00')

results[0].start.date();  // Tue Apl 1 2025 09:00:00 GMT+0900 (JST)
results[0].end.date();    // Wen Apl 2 2025 17:00:00 GMT+0900 (JST)


おわりに

正規表現や分岐などを駆使して自分でパーサーを作るのは中々骨が折れますよね。
chrono、よければ使ってみてください。

Discussion