22
22
use crate :: cal:: iso:: { Iso , IsoDateInner } ;
23
23
use crate :: calendar_arithmetic:: PrecomputedDataSource ;
24
24
use crate :: calendar_arithmetic:: { ArithmeticDate , CalendarArithmetic } ;
25
- use crate :: error:: DateError ;
25
+ use crate :: error:: { year_check , DateError } ;
26
26
use crate :: provider:: hijri:: PackedHijriYearInfo ;
27
27
use crate :: provider:: hijri:: { CalendarHijriSimulatedMeccaV1 , HijriData } ;
28
28
use crate :: types:: EraYear ;
@@ -38,19 +38,28 @@ use ummalqura_data::{UMMALQURA_DATA, UMMALQURA_DATA_STARTING_YEAR};
38
38
mod ummalqura_data;
39
39
40
40
fn era_year ( year : i32 ) -> EraYear {
41
- types:: EraYear {
42
- era : tinystr ! ( 16 , "ah" ) ,
43
- era_index : Some ( 0 ) ,
44
- year,
45
- ambiguity : types:: YearAmbiguity :: CenturyRequired ,
41
+ if year > 0 {
42
+ types:: EraYear {
43
+ era : tinystr ! ( 16 , "ah" ) ,
44
+ era_index : Some ( 0 ) ,
45
+ year,
46
+ ambiguity : types:: YearAmbiguity :: CenturyRequired ,
47
+ }
48
+ } else {
49
+ types:: EraYear {
50
+ era : tinystr ! ( 16 , "bh" ) ,
51
+ era_index : Some ( 1 ) ,
52
+ year : 1 - year,
53
+ ambiguity : types:: YearAmbiguity :: CenturyRequired ,
54
+ }
46
55
}
47
56
}
48
57
49
58
/// The [simulated Hijri Calendar](https://en.wikipedia.org/wiki/Islamic_calendar)
50
59
///
51
60
/// # Era codes
52
61
///
53
- /// This calendar uses a single era code `ah`, Anno Hegirae. Dates before this era use negative years.
62
+ /// This calendar uses two era codes: `ah`, and `bh`, corresponding to the Anno Hegirae and Before Hijrah eras
54
63
///
55
64
/// # Month codes
56
65
///
@@ -81,7 +90,7 @@ impl HijriSimulatedLocation {
81
90
///
82
91
/// # Era codes
83
92
///
84
- /// This calendar uses a single era code `ah`, Anno Hegirae. Dates before this era use negative years.
93
+ /// This calendar uses two era codes: `ah`, and `bh`, corresponding to the Anno Hegirae and Before Hijrah eras
85
94
///
86
95
/// # Month codes
87
96
///
@@ -99,7 +108,7 @@ pub struct HijriUmmAlQura;
99
108
///
100
109
/// # Era codes
101
110
///
102
- /// This calendar uses a single era code `ah`, Anno Hegirae. Dates before this era use negative years.
111
+ /// This calendar uses two era codes: `ah`, and `bh`, corresponding to the Anno Hegirae and Before Hijrah eras
103
112
///
104
113
/// # Month codes
105
114
///
@@ -376,7 +385,8 @@ impl Calendar for HijriSimulated {
376
385
day : u8 ,
377
386
) -> Result < Self :: DateInner , DateError > {
378
387
let year = match era {
379
- Some ( "islamic-rgsa" | "ah" ) | None => year,
388
+ Some ( "ah" ) | None => year_check ( year, 1 ..) ?,
389
+ Some ( "bh" ) => 1 - year_check ( year, 1 ..) ?,
380
390
Some ( _) => return Err ( DateError :: UnknownEra ) ,
381
391
} ;
382
392
let Some ( ( month, false ) ) = month_code. parsed ( ) else {
@@ -658,7 +668,8 @@ impl Calendar for HijriUmmAlQura {
658
668
day : u8 ,
659
669
) -> Result < Self :: DateInner , DateError > {
660
670
let year = match era {
661
- Some ( "islamic-umalqura" | "ah" ) | None => year,
671
+ Some ( "ah" ) | None => year_check ( year, 1 ..) ?,
672
+ Some ( "bh" ) => 1 - year_check ( year, 1 ..) ?,
662
673
Some ( _) => return Err ( DateError :: UnknownEra ) ,
663
674
} ;
664
675
let Some ( ( month, false ) ) = month_code. parsed ( ) else {
@@ -883,9 +894,8 @@ impl Calendar for HijriTabular {
883
894
day : u8 ,
884
895
) -> Result < Self :: DateInner , DateError > {
885
896
let year = match era {
886
- Some ( "ah" ) | None => year,
887
- Some ( "islamic-civil" | "islamicc" ) if self . epoch == HijriTabularEpoch :: Friday => year,
888
- Some ( "islamic-tbla" ) if self . epoch == HijriTabularEpoch :: Thursday => year,
897
+ Some ( "ah" ) | None => year_check ( year, 1 ..) ?,
898
+ Some ( "bh" ) => 1 - year_check ( year, 1 ..) ?,
889
899
Some ( _) => return Err ( DateError :: UnknownEra ) ,
890
900
} ;
891
901
@@ -1895,11 +1905,9 @@ mod test {
1895
1905
#[ test]
1896
1906
fn test_regression_4914 ( ) {
1897
1907
// https://github.com/unicode-org/icu4x/issues/4914
1898
- let cal = HijriUmmAlQura :: new ( ) ;
1899
- let era = "islamic-umalqura" ;
1900
- let year = -6823 ;
1901
- let month_code = MonthCode ( tinystr ! ( 4 , "M01" ) ) ;
1902
- let dt = cal. from_codes ( Some ( era) , year, month_code, 1 ) . unwrap ( ) ;
1908
+ let dt = HijriUmmAlQura :: new ( )
1909
+ . from_codes ( Some ( "bh" ) , 6824 , MonthCode :: new_normal ( 1 ) . unwrap ( ) , 1 )
1910
+ . unwrap ( ) ;
1903
1911
assert_eq ! ( dt. 0 . day, 1 ) ;
1904
1912
assert_eq ! ( dt. 0 . month, 1 ) ;
1905
1913
assert_eq ! ( dt. 0 . year. value, -6823 ) ;
0 commit comments