diff --git a/docs/std.md b/docs/std.md index 65516602..4b58be12 100644 --- a/docs/std.md +++ b/docs/std.md @@ -94,6 +94,10 @@ _date_ を渡した場合、_date_に対応するミリ秒、 渡していない場合は現在時刻のミリ秒が返されます。 ### @Date:parse(_date_: str): num +日付として解釈可能な文字列から日時を表す数値を生成します。 +解釈は[JavaScriptのDateコンストラクター](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/Date)に依存します。 +引数が日付として解釈可能でない場合、エラー型の値(`name`=`'not_date'`)を返します。 + ### @Date:to_iso_str(_date_?: num, _time_offset_?: num): str _date_ を拡張表記のISO形式にした文字列を返します。 diff --git a/src/interpreter/lib/std.ts b/src/interpreter/lib/std.ts index f3fbbc86..a0aed95c 100644 --- a/src/interpreter/lib/std.ts +++ b/src/interpreter/lib/std.ts @@ -218,7 +218,9 @@ export const std: Record = { 'Date:parse': FN_NATIVE(([v]) => { assertString(v); - return NUM(new Date(v.value).getTime()); + const res = new Date(v.value).getTime(); + // NaN doesn't equal to itself + return (res === res) ? NUM(res) : ERROR('not_date'); }), 'Date:to_iso_str': FN_NATIVE(([v, ofs]) => { diff --git a/test/std.ts b/test/std.ts index e4f8f5e6..9bdc96c3 100644 --- a/test/std.ts +++ b/test/std.ts @@ -420,4 +420,21 @@ describe('Date', () => { eq(res.value[0], res.value[1]); eq(res.value[2], STR("2024-04-11T11:29:46.021-05:18")); }); + + test.concurrent('parse', async () => { + eq(await exe(`<: [ + '01 Jan 1970 00:00:00 GMT' + '1970-01-01' + '1970-01-01T00:00:00.000Z' + '1970-01-01T00:00:00.000+00:00' + 'hoge' + ].map(Date:parse)`), ARR([ + NUM(0), + NUM(0), + NUM(0), + NUM(0), + ERROR('not_date') + ])); + }); + }); }); diff --git a/unreleased/date-parse-err.md b/unreleased/date-parse-err.md new file mode 100644 index 00000000..f90abf02 --- /dev/null +++ b/unreleased/date-parse-err.md @@ -0,0 +1 @@ +- `Date:parse`がパース失敗時にエラー型の値を返すように