From 28029f2a7777b250f8d82196684e272290f1f960 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Sun, 16 Aug 2026 10:58:50 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20Date=20=E5=A4=9A=E5=8F=82=E6=9E=84?= =?UTF-8?q?=E9=80=A0=E5=B9=B4=200-99=20=E6=8C=89=E8=A7=84=E8=8C=83?= =?UTF-8?q?=E6=98=A0=E5=B0=84=E5=88=B0=201900-1999?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_builtins/src/date.rs | 6 ++++++ crates/oxide_vm/tests/builtins_date_tests.rs | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/crates/oxide_builtins/src/date.rs b/crates/oxide_builtins/src/date.rs index c89e70f4..29773f4d 100644 --- a/crates/oxide_builtins/src/date.rs +++ b/crates/oxide_builtins/src/date.rs @@ -179,6 +179,12 @@ pub fn date_constructor(vm: &mut H, args: &[u8]) -> NativeResult { Utc::now().timestamp_millis() as f64 } else if args.len() > 2 { let y_val = oxide_runtime_api::to_number(vm.reg(args[1])); + // 年 0..99 按规范映射到 1900..1999(ToInteger 截断后判断)。 + let y_val = if (0.0..=99.0).contains(&y_val.trunc()) { + y_val.trunc() + 1900.0 + } else { + y_val + }; let m_val = oxide_runtime_api::to_number(vm.reg(args[2])); let d_val = if args.len() > 3 { oxide_runtime_api::to_number(vm.reg(args[3])) } else { 1.0 }; let h_val = if args.len() > 4 { oxide_runtime_api::to_number(vm.reg(args[4])) } else { 0.0 }; diff --git a/crates/oxide_vm/tests/builtins_date_tests.rs b/crates/oxide_vm/tests/builtins_date_tests.rs index 9c871b9b..c55dcb70 100644 --- a/crates/oxide_vm/tests/builtins_date_tests.rs +++ b/crates/oxide_vm/tests/builtins_date_tests.rs @@ -326,6 +326,18 @@ fn date_constructor_truncation() { assert_eq!(r.as_double(), 5.0); } +#[test] +fn date_constructor_two_digit_year_maps_to_1900s() { + let mut vm = Vm::new(); + // 多参构造年 0..99 按规范映射到 1900..1999;100 起不再调整。 + let r = eval(&mut vm, "new Date(0, 0).getFullYear()").unwrap(); + assert_eq!(r.as_double(), 1900.0); + let r = eval(&mut vm, "new Date(99, 0).getFullYear()").unwrap(); + assert_eq!(r.as_double(), 1999.0); + let r = eval(&mut vm, "new Date(100, 0).getFullYear()").unwrap(); + assert_eq!(r.as_double(), 100.0); +} + #[test] fn date_setters_return_timestamp() { let mut vm = Vm::new();