fix: Date 多参构造年 0-99 按规范映射到 1900-1999
This commit is contained in:
@@ -179,6 +179,12 @@ pub fn date_constructor<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResult {
|
|||||||
Utc::now().timestamp_millis() as f64
|
Utc::now().timestamp_millis() as f64
|
||||||
} else if args.len() > 2 {
|
} else if args.len() > 2 {
|
||||||
let y_val = oxide_runtime_api::to_number(vm.reg(args[1]));
|
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 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 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 };
|
let h_val = if args.len() > 4 { oxide_runtime_api::to_number(vm.reg(args[4])) } else { 0.0 };
|
||||||
|
|||||||
@@ -326,6 +326,18 @@ fn date_constructor_truncation() {
|
|||||||
assert_eq!(r.as_double(), 5.0);
|
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]
|
#[test]
|
||||||
fn date_setters_return_timestamp() {
|
fn date_setters_return_timestamp() {
|
||||||
let mut vm = Vm::new();
|
let mut vm = Vm::new();
|
||||||
|
|||||||
Reference in New Issue
Block a user