From 3220c5fffc8d13cac710356311ef5ce951240710 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Fri, 16 Oct 2026 06:42:50 +0000 Subject: [PATCH] =?UTF-8?q?style:=20=E8=87=AA=E5=8A=A8=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oxide_builtins/src/temporal/calendar.rs | 90 +++++++++---------- .../oxide_builtins/src/temporal/plain_date.rs | 14 ++- .../src/temporal/plain_year_month.rs | 3 +- 3 files changed, 52 insertions(+), 55 deletions(-) diff --git a/crates/oxide_builtins/src/temporal/calendar.rs b/crates/oxide_builtins/src/temporal/calendar.rs index 60120655..100ead3d 100644 --- a/crates/oxide_builtins/src/temporal/calendar.rs +++ b/crates/oxide_builtins/src/temporal/calendar.rs @@ -88,20 +88,20 @@ enum StartOfYear { enum Keviyah { // 平年 BetHetGimel = 0, // 2D3 - BetShinHe = 1, // 2C5 - GimelKafHe = 2, // 3R5 - HeKafZayin = 3, // 5R7 - HeShinAlef = 4, // 5C1 - ZayinHetAlef = 5, // 7D1 + BetShinHe = 1, // 2C5 + GimelKafHe = 2, // 3R5 + HeKafZayin = 3, // 5R7 + HeShinAlef = 4, // 5C1 + ZayinHetAlef = 5, // 7D1 ZayinShinGimel = 6, // 7C3 // 闰年 - BetHetHe = 7, // 2D5 - BetShinZayin = 8, // 2C7 - GimelKafZayin = 9, // 3R7 - HeHetAlef = 10, // 5D1 - HeShinGimel = 11, // 5C3 + BetHetHe = 7, // 2D5 + BetShinZayin = 8, // 2C7 + GimelKafZayin = 9, // 3R7 + HeHetAlef = 10, // 5D1 + HeShinGimel = 11, // 5C3 ZayinHetGimel = 12, // 7D3 - ZayinShinHe = 13, // 7C5 + ZayinShinHe = 13, // 7C5 } impl Keviyah { @@ -156,14 +156,11 @@ impl Keviyah { let is_leap = self.is_leap(); // 闰年中 Adar 之后的序月对应上一个月号。 let month_number = ordinal_month - (is_leap && ordinal_month >= 6) as u8; - 29 - + ( - month_number % 2 + 29 + (month_number % 2 // Heshvan 在全年型为长月 + (ordinal_month == 2 && year_type == YearType::Complete) as u8 // Kislev 在缺年型为短月 - - (ordinal_month == 3 && year_type == YearType::Deficient) as u8 - ) + - (ordinal_month == 3 && year_type == YearType::Deficient) as u8) } /// 第 ordinal_month 个序月之前的累计天数。 @@ -172,15 +169,13 @@ impl Keviyah { let is_leap = self.is_leap(); let month_number = ordinal_month - (is_leap && ordinal_month > 6) as u8; 29 * (ordinal_month as u16 - 1) - + ( - month_number / 2 + + (month_number / 2 // Adar I 为长月 + (is_leap && ordinal_month > 6) as u8 // Heshvan 在全年型为长月 + (ordinal_month > 2 && year_type == YearType::Complete) as u8 // Kislev 在缺年型为短月 - - (ordinal_month > 3 && year_type == YearType::Deficient) as u8 - ) as u16 + - (ordinal_month > 3 && year_type == YearType::Deficient) as u8) as u16 } /// 年内第 day_of_year 天(1 起)折算为(序月, 月内日)。 @@ -288,19 +283,15 @@ impl YearInfo { if in_week >= hal(7, 18, 0) { weeks_since_beharad += 1; } - Self { - keviyah, - weeks_since_beharad, - } + Self { keviyah, weeks_since_beharad } } /// 新年首日(Tishrei 1)的 ISO 纪元日。 fn new_year(self) -> i128 { // Beharad 周从周一开始。 const BEHARAD_START_OF_YEAR: i128 = StartOfYear::Monday as i128; - let days_since_beharad = self.weeks_since_beharad * 7 - + self.keviyah.start_of_year() as i128 - - BEHARAD_START_OF_YEAR; + let days_since_beharad = + self.weeks_since_beharad * 7 + self.keviyah.start_of_year() as i128 - BEHARAD_START_OF_YEAR; HEBREW_EPOCH_DAYS + days_since_beharad } @@ -347,9 +338,7 @@ pub(crate) const HEBREW_ERA: &str = "am"; /// hebrew 日期(年, 序月, 日)→ ISO 纪元日。 pub(crate) fn hebrew_to_iso_days(h_year: i128, ordinal_month: u32, day: u32) -> i128 { let year_info = YearInfo::compute_for(h_year); - year_info.new_year() - + year_info.keviyah.days_preceding(ordinal_month as u8) as i128 - + (day - 1) as i128 + year_info.new_year() + year_info.keviyah.days_preceding(ordinal_month as u8) as i128 + (day - 1) as i128 } /// ISO 纪元日 → hebrew 日期(年, 序月, 日)。 @@ -368,11 +357,7 @@ pub(crate) fn hebrew_to_iso(h_year: i128, ordinal_month: u32, day: u32) -> (i32, /// ISO 日期分量 → hebrew 日期(年, 序月, 日)。 pub(crate) fn iso_to_hebrew(iso_year: i32, iso_month: u32, iso_day: u32) -> (i128, u32, u32) { - iso_days_to_hebrew(days_from_civil( - i128::from(iso_year), - i128::from(iso_month), - i128::from(iso_day), - )) + iso_days_to_hebrew(days_from_civil(i128::from(iso_year), i128::from(iso_month), i128::from(iso_day))) } /// 数值月(平年 1-12、闰年 1-13)→ 序月:hebrew 数值月即序月(闰年 Adar I 为 6、 @@ -455,10 +440,7 @@ mod tests { fn test_year_lengths_valid() { for year in 3700..=5800 { let len = hebrew_year_length(year); - assert!( - matches!(len, 353 | 354 | 355 | 383 | 384 | 385), - "year {year} -> {len}" - ); + assert!(matches!(len, 353 | 354 | 355 | 383 | 384 | 385), "year {year} -> {len}"); } } @@ -528,12 +510,30 @@ mod tests { fn test_icu4x_vectors() { let cases: [Vector4x; 6] = [ // iso 为公历年月日,heb 为希伯来年与序数月与日 - Vector4x { iso: (2021, 1, 10), heb: (5781, 4, 26) }, - Vector4x { iso: (2021, 9, 10), heb: (5782, 1, 4) }, - Vector4x { iso: (2022, 2, 10), heb: (5782, 6, 9) }, // Adar I(闰年) - Vector4x { iso: (2022, 3, 10), heb: (5782, 7, 7) }, // Adar II(闰年) - Vector4x { iso: (2022, 10, 10), heb: (5783, 1, 15) }, - Vector4x { iso: (2022, 12, 25), heb: (5783, 4, 1) }, + Vector4x { + iso: (2021, 1, 10), + heb: (5781, 4, 26), + }, + Vector4x { + iso: (2021, 9, 10), + heb: (5782, 1, 4), + }, + Vector4x { + iso: (2022, 2, 10), + heb: (5782, 6, 9), + }, // Adar I(闰年) + Vector4x { + iso: (2022, 3, 10), + heb: (5782, 7, 7), + }, // Adar II(闰年) + Vector4x { + iso: (2022, 10, 10), + heb: (5783, 1, 15), + }, + Vector4x { + iso: (2022, 12, 25), + heb: (5783, 4, 1), + }, ]; for v in cases { let (iy, im, id) = v.iso; diff --git a/crates/oxide_builtins/src/temporal/plain_date.rs b/crates/oxide_builtins/src/temporal/plain_date.rs index 944e2787..c6a8262a 100644 --- a/crates/oxide_builtins/src/temporal/plain_date.rs +++ b/crates/oxide_builtins/src/temporal/plain_date.rs @@ -6,9 +6,9 @@ use oxide_types::object::JsObject; use oxide_types::value::JsValue; use super::calendar::{ - hebrew_days_in_month, hebrew_is_leap, hebrew_month_code, hebrew_months_in_year, - hebrew_number_from_ordinal, hebrew_ordinal_from_month_code, hebrew_ordinal_from_number, hebrew_to_iso, - hebrew_year_length, iso_to_hebrew, HEBREW_ERA, + hebrew_days_in_month, hebrew_is_leap, hebrew_month_code, hebrew_months_in_year, hebrew_number_from_ordinal, + hebrew_ordinal_from_month_code, hebrew_ordinal_from_number, hebrew_to_iso, hebrew_year_length, iso_to_hebrew, + HEBREW_ERA, }; use super::common::native_try; use super::common::{ @@ -257,9 +257,7 @@ fn plain_date_ymd(vm: &mut H, args: &[u8]) -> Result<(f64, f64, f64), /// 读 PlainDate 的 ISO 分量(槽 0-2)与日历 ID(槽 3),含 receiver 校验。 /// getter 按日历 ID 分发:hebrew 换算为历法字段,其余历法直返 ISO 分量。 -fn plain_date_iso_ymd_calendar( - vm: &mut H, args: &[u8], -) -> Result<(i32, u32, u32, String), JsValue> { +fn plain_date_iso_ymd_calendar(vm: &mut H, args: &[u8]) -> Result<(i32, u32, u32, String), JsValue> { let ptr = receiver_obj(vm, args)?; let obj = unsafe { &*ptr }; ensure_plain_date(vm, obj)?; @@ -429,9 +427,7 @@ fn hebrew_object_date_ymd( let era_present = !era_raw.is_undefined(); let era_year_present = !era_year_raw.is_undefined(); if era_present != era_year_present { - return Err(crate::error::create_type_error( - vm, "era and eraYear must both be present or both absent", - )); + return Err(crate::error::create_type_error(vm, "era and eraYear must both be present or both absent")); } let hebrew_year = if era_year_present { let era = temporal_option_string(vm, era_raw)?; diff --git a/crates/oxide_builtins/src/temporal/plain_year_month.rs b/crates/oxide_builtins/src/temporal/plain_year_month.rs index 920ac2d2..8b77b89a 100644 --- a/crates/oxide_builtins/src/temporal/plain_year_month.rs +++ b/crates/oxide_builtins/src/temporal/plain_year_month.rs @@ -359,7 +359,8 @@ pub fn plain_year_month_from(vm: &mut H, args: &[u8]) -> NativeResult if calendar == "hebrew" { if era_present != era_year_present { return NativeResult::Err(crate::error::create_type_error( - vm, "era and eraYear must both be present or both absent", + vm, + "era and eraYear must both be present or both absent", )); } if era_present {