use super::{AsExcelDate, DateMode};
use chrono::{TimeZone, Utc};
fn check_datetime(
year: i32,
month: u32,
day: u32,
hour: u32,
min: u32,
sec: u32,
milli: u32,
expected: f64,
) {
assert_eq!(
Utc.ymd(year, month, day)
.and_hms_milli(hour, min, sec, milli)
.as_excel_date(DateMode::BasedOn1900),
expected
);
}
fn check_date(year: i32, month: u32, day: u32, expected: usize) {
assert_eq!(
Utc.ymd(year, month, day)
.and_hms(0, 0, 0)
.as_excel_date(DateMode::BasedOn1900),
expected as f64
);
}
#[test]
fn datetime_date_and_time() {
check_datetime(1899, 12, 31, 0, 0, 0, 000, 0.0);
check_datetime(1982, 8, 25, 0, 15, 20, 213, 30188.010650613425);
check_datetime(2065, 4, 19, 0, 16, 48, 290, 60376.011670023145);
check_datetime(2147, 12, 15, 0, 55, 25, 446, 90565.038488958337);
check_datetime(2230, 8, 10, 1, 2, 46, 891, 120753.04359827546);
check_datetime(2313, 4, 6, 1, 4, 15, 597, 150942.04462496529);
check_datetime(2395, 11, 30, 1, 9, 40, 889, 181130.04838991899);
check_datetime(2478, 7, 25, 1, 11, 32, 560, 211318.04968240741);
check_datetime(2561, 3, 21, 1, 30, 19, 169, 241507.06272186342);
check_datetime(2643, 11, 15, 1, 48, 25, 580, 271695.07529606484);
check_datetime(2726, 7, 12, 2, 3, 31, 919, 301884.08578609955);
check_datetime(2809, 3, 6, 2, 11, 11, 986, 332072.09111094906);
check_datetime(2891, 10, 31, 2, 24, 37, 095, 362261.10042934027);
check_datetime(2974, 6, 26, 2, 35, 7, 220, 392449.10772245371);
check_datetime(3057, 2, 19, 2, 45, 12, 109, 422637.1147234838);
check_datetime(3139, 10, 17, 3, 6, 39, 990, 452826.12962951389);
check_datetime(3222, 6, 11, 3, 8, 8, 251, 483014.13065105322);
check_datetime(3305, 2, 5, 3, 19, 12, 576, 513203.13834);
check_datetime(3387, 10, 1, 3, 29, 42, 574, 543391.14563164348);
check_datetime(3470, 5, 27, 3, 37, 30, 813, 573579.15105107636);
check_datetime(3553, 1, 21, 4, 14, 38, 231, 603768.17683137732);
check_datetime(3635, 9, 16, 4, 16, 28, 559, 633956.17810832174);
check_datetime(3718, 5, 13, 4, 17, 58, 222, 664145.17914608796);
check_datetime(3801, 1, 6, 4, 21, 41, 794, 694333.18173372687);
check_datetime(3883, 9, 2, 4, 56, 35, 792, 724522.20596981479);
check_datetime(3966, 4, 28, 5, 25, 14, 885, 754710.2258667245);
check_datetime(4048, 12, 21, 5, 26, 5, 724, 784898.22645513888);
check_datetime(4131, 8, 18, 5, 46, 44, 068, 815087.24078782403);
check_datetime(4214, 4, 13, 5, 48, 1, 141, 845275.24167987274);
check_datetime(4296, 12, 7, 5, 53, 52, 315, 875464.24574438657);
check_datetime(4379, 8, 3, 6, 14, 48, 580, 905652.26028449077);
check_datetime(4462, 3, 28, 6, 46, 15, 738, 935840.28212659725);
check_datetime(4544, 11, 22, 7, 31, 20, 407, 966029.31343063654);
check_datetime(4627, 7, 19, 7, 58, 33, 754, 996217.33233511576);
check_datetime(4710, 3, 15, 8, 7, 43, 130, 1026406.3386936343);
check_datetime(4792, 11, 7, 8, 29, 11, 091, 1056594.3536005903);
check_datetime(4875, 7, 4, 9, 8, 15, 328, 1086783.3807329629);
check_datetime(4958, 2, 27, 9, 30, 41, 781, 1116971.3963169097);
check_datetime(5040, 10, 23, 9, 34, 4, 462, 1147159.3986627546);
check_datetime(5123, 6, 20, 9, 37, 23, 945, 1177348.4009715857);
check_datetime(5206, 2, 12, 9, 37, 56, 655, 1207536.4013501736);
check_datetime(5288, 10, 8, 9, 45, 12, 230, 1237725.406391551);
check_datetime(5371, 6, 4, 9, 54, 14, 782, 1267913.412671088);
check_datetime(5454, 1, 28, 9, 54, 22, 108, 1298101.4127558796);
check_datetime(5536, 9, 24, 10, 1, 36, 151, 1328290.4177795255);
check_datetime(5619, 5, 20, 12, 9, 48, 602, 1358478.5068125231);
check_datetime(5702, 1, 14, 12, 34, 8, 549, 1388667.5237100578);
check_datetime(5784, 9, 8, 12, 56, 6, 495, 1418855.5389640625);
check_datetime(5867, 5, 6, 12, 58, 58, 217, 1449044.5409515856);
check_datetime(5949, 12, 30, 12, 59, 54, 263, 1479232.5416002662);
check_datetime(6032, 8, 24, 13, 34, 41, 331, 1509420.5657561459);
check_datetime(6115, 4, 21, 13, 58, 28, 601, 1539609.5822754744);
check_datetime(6197, 12, 14, 14, 2, 16, 899, 1569797.5849178126);
check_datetime(6280, 8, 10, 14, 36, 17, 444, 1599986.6085352316);
check_datetime(6363, 4, 6, 14, 37, 57, 451, 1630174.60969272);
check_datetime(6445, 11, 30, 14, 57, 42, 757, 1660363.6234115392);
check_datetime(6528, 7, 26, 15, 10, 48, 307, 1690551.6325035533);
check_datetime(6611, 3, 22, 15, 14, 39, 890, 1720739.635183912);
check_datetime(6693, 11, 15, 15, 19, 47, 988, 1750928.6387498612);
check_datetime(6776, 7, 11, 16, 4, 24, 344, 1781116.6697262037);
check_datetime(6859, 3, 7, 16, 22, 23, 952, 1811305.6822216667);
check_datetime(6941, 10, 31, 16, 29, 55, 999, 1841493.6874536921);
check_datetime(7024, 6, 26, 16, 58, 20, 259, 1871681.7071789235);
check_datetime(7107, 2, 21, 17, 4, 2, 415, 1901870.7111390624);
check_datetime(7189, 10, 16, 17, 18, 29, 630, 1932058.7211762732);
check_datetime(7272, 6, 11, 17, 47, 21, 323, 1962247.7412190163);
check_datetime(7355, 2, 5, 17, 53, 29, 866, 1992435.7454845603);
check_datetime(7437, 10, 2, 17, 53, 41, 076, 2022624.7456143056);
check_datetime(7520, 5, 28, 17, 55, 6, 044, 2052812.7465977315);
check_datetime(7603, 1, 21, 18, 14, 49, 151, 2083000.7602910995);
check_datetime(7685, 9, 16, 18, 17, 45, 738, 2113189.7623349307);
check_datetime(7768, 5, 12, 18, 29, 59, 700, 2143377.7708298611);
check_datetime(7851, 1, 7, 18, 33, 21, 233, 2173566.773162419);
check_datetime(7933, 9, 2, 19, 14, 24, 673, 2203754.8016744559);
check_datetime(8016, 4, 27, 19, 17, 12, 816, 2233942.8036205554);
check_datetime(8098, 12, 22, 19, 23, 36, 418, 2264131.8080603937);
check_datetime(8181, 8, 17, 19, 46, 25, 908, 2294319.8239109721);
check_datetime(8264, 4, 13, 20, 7, 47, 314, 2324508.8387420601);
check_datetime(8346, 12, 8, 20, 31, 37, 603, 2354696.855296331);
check_datetime(8429, 8, 3, 20, 39, 57, 770, 2384885.8610853008);
check_datetime(8512, 3, 29, 20, 50, 17, 067, 2415073.8682530904);
check_datetime(8594, 11, 22, 21, 2, 57, 827, 2445261.8770581828);
check_datetime(8677, 7, 19, 21, 23, 5, 519, 2475450.8910360998);
check_datetime(8760, 3, 14, 21, 34, 49, 572, 2505638.8991848612);
check_datetime(8842, 11, 8, 21, 39, 5, 944, 2535827.9021521294);
check_datetime(8925, 7, 4, 21, 39, 18, 426, 2566015.9022965971);
check_datetime(9008, 2, 28, 21, 46, 7, 769, 2596203.9070343636);
check_datetime(9090, 10, 24, 21, 57, 55, 662, 2626392.9152275696);
check_datetime(9173, 6, 19, 22, 19, 11, 732, 2656580.9299968979);
check_datetime(9256, 2, 13, 22, 23, 51, 376, 2686769.9332335186);
check_datetime(9338, 10, 9, 22, 27, 58, 771, 2716957.9360968866);
check_datetime(9421, 6, 5, 22, 43, 30, 392, 2747146.9468795368);
check_datetime(9504, 1, 30, 22, 48, 25, 834, 2777334.9502990046);
check_datetime(9586, 9, 24, 22, 53, 51, 727, 2807522.9540709145);
check_datetime(9669, 5, 20, 23, 12, 56, 536, 2837711.9673210187);
check_datetime(9752, 1, 14, 23, 15, 54, 109, 2867899.9693762613);
check_datetime(9834, 9, 10, 23, 17, 12, 632, 2898088.9702850925);
check_datetime(9999, 12, 31, 23, 59, 59, 000, 2958465.999988426);
}
#[test]
fn datetime_date_only() {
check_date(1899, 12, 31, 0);
check_date(1900, 1, 1, 1);
check_date(1900, 2, 27, 58);
check_date(1900, 2, 28, 59);
check_date(1900, 3, 1, 61);
check_date(1900, 3, 2, 62);
check_date(1900, 3, 11, 71);
check_date(1900, 4, 8, 99);
check_date(1900, 9, 12, 256);
check_date(1901, 5, 3, 489);
check_date(1901, 10, 13, 652);
check_date(1902, 2, 15, 777);
check_date(1902, 6, 6, 888);
check_date(1902, 9, 25, 999);
check_date(1902, 9, 27, 1001);
check_date(1903, 4, 26, 1212);
check_date(1903, 8, 5, 1313);
check_date(1903, 12, 31, 1461);
check_date(1904, 1, 1, 1462);
check_date(1904, 2, 28, 1520);
check_date(1904, 2, 29, 1521);
check_date(1904, 3, 1, 1522);
check_date(1907, 2, 27, 2615);
check_date(1907, 2, 28, 2616);
check_date(1907, 3, 1, 2617);
check_date(1907, 3, 2, 2618);
check_date(1907, 3, 3, 2619);
check_date(1907, 3, 4, 2620);
check_date(1907, 3, 5, 2621);
check_date(1907, 3, 6, 2622);
check_date(1999, 1, 1, 36161);
check_date(1999, 1, 31, 36191);
check_date(1999, 2, 1, 36192);
check_date(1999, 2, 28, 36219);
check_date(1999, 3, 1, 36220);
check_date(1999, 3, 31, 36250);
check_date(1999, 4, 1, 36251);
check_date(1999, 4, 30, 36280);
check_date(1999, 5, 1, 36281);
check_date(1999, 5, 31, 36311);
check_date(1999, 6, 1, 36312);
check_date(1999, 6, 30, 36341);
check_date(1999, 7, 1, 36342);
check_date(1999, 7, 31, 36372);
check_date(1999, 8, 1, 36373);
check_date(1999, 8, 31, 36403);
check_date(1999, 9, 1, 36404);
check_date(1999, 9, 30, 36433);
check_date(1999, 10, 1, 36434);
check_date(1999, 10, 31, 36464);
check_date(1999, 11, 1, 36465);
check_date(1999, 11, 30, 36494);
check_date(1999, 12, 1, 36495);
check_date(1999, 12, 31, 36525);
check_date(2000, 1, 1, 36526);
check_date(2000, 1, 31, 36556);
check_date(2000, 2, 1, 36557);
check_date(2000, 2, 29, 36585);
check_date(2000, 3, 1, 36586);
check_date(2000, 3, 31, 36616);
check_date(2000, 4, 1, 36617);
check_date(2000, 4, 30, 36646);
check_date(2000, 5, 1, 36647);
check_date(2000, 5, 31, 36677);
check_date(2000, 6, 1, 36678);
check_date(2000, 6, 30, 36707);
check_date(2000, 7, 1, 36708);
check_date(2000, 7, 31, 36738);
check_date(2000, 8, 1, 36739);
check_date(2000, 8, 31, 36769);
check_date(2000, 9, 1, 36770);
check_date(2000, 9, 30, 36799);
check_date(2000, 10, 1, 36800);
check_date(2000, 10, 31, 36830);
check_date(2000, 11, 1, 36831);
check_date(2000, 11, 30, 36860);
check_date(2000, 12, 1, 36861);
check_date(2000, 12, 31, 36891);
check_date(2001, 1, 1, 36892);
check_date(2001, 1, 31, 36922);
check_date(2001, 2, 1, 36923);
check_date(2001, 2, 28, 36950);
check_date(2001, 3, 1, 36951);
check_date(2001, 3, 31, 36981);
check_date(2001, 4, 1, 36982);
check_date(2001, 4, 30, 37011);
check_date(2001, 5, 1, 37012);
check_date(2001, 5, 31, 37042);
check_date(2001, 6, 1, 37043);
check_date(2001, 6, 30, 37072);
check_date(2001, 7, 1, 37073);
check_date(2001, 7, 31, 37103);
check_date(2001, 8, 1, 37104);
check_date(2001, 8, 31, 37134);
check_date(2001, 9, 1, 37135);
check_date(2001, 9, 30, 37164);
check_date(2001, 10, 1, 37165);
check_date(2001, 10, 31, 37195);
check_date(2001, 11, 1, 37196);
check_date(2001, 11, 30, 37225);
check_date(2001, 12, 1, 37226);
check_date(2001, 12, 31, 37256);
check_date(2400, 1, 1, 182623);
check_date(2400, 1, 31, 182653);
check_date(2400, 2, 1, 182654);
check_date(2400, 2, 29, 182682);
check_date(2400, 3, 1, 182683);
check_date(2400, 3, 31, 182713);
check_date(2400, 4, 1, 182714);
check_date(2400, 4, 30, 182743);
check_date(2400, 5, 1, 182744);
check_date(2400, 5, 31, 182774);
check_date(2400, 6, 1, 182775);
check_date(2400, 6, 30, 182804);
check_date(2400, 7, 1, 182805);
check_date(2400, 7, 31, 182835);
check_date(2400, 8, 1, 182836);
check_date(2400, 8, 31, 182866);
check_date(2400, 9, 1, 182867);
check_date(2400, 9, 30, 182896);
check_date(2400, 10, 1, 182897);
check_date(2400, 10, 31, 182927);
check_date(2400, 11, 1, 182928);
check_date(2400, 11, 30, 182957);
check_date(2400, 12, 1, 182958);
check_date(2400, 12, 31, 182988);
check_date(4000, 1, 1, 767011);
check_date(4000, 1, 31, 767041);
check_date(4000, 2, 1, 767042);
check_date(4000, 2, 29, 767070);
check_date(4000, 3, 1, 767071);
check_date(4000, 3, 31, 767101);
check_date(4000, 4, 1, 767102);
check_date(4000, 4, 30, 767131);
check_date(4000, 5, 1, 767132);
check_date(4000, 5, 31, 767162);
check_date(4000, 6, 1, 767163);
check_date(4000, 6, 30, 767192);
check_date(4000, 7, 1, 767193);
check_date(4000, 7, 31, 767223);
check_date(4000, 8, 1, 767224);
check_date(4000, 8, 31, 767254);
check_date(4000, 9, 1, 767255);
check_date(4000, 9, 30, 767284);
check_date(4000, 10, 1, 767285);
check_date(4000, 10, 31, 767315);
check_date(4000, 11, 1, 767316);
check_date(4000, 11, 30, 767345);
check_date(4000, 12, 1, 767346);
check_date(4000, 12, 31, 767376);
check_date(4321, 1, 1, 884254);
check_date(4321, 1, 31, 884284);
check_date(4321, 2, 1, 884285);
check_date(4321, 2, 28, 884312);
check_date(4321, 3, 1, 884313);
check_date(4321, 3, 31, 884343);
check_date(4321, 4, 1, 884344);
check_date(4321, 4, 30, 884373);
check_date(4321, 5, 1, 884374);
check_date(4321, 5, 31, 884404);
check_date(4321, 6, 1, 884405);
check_date(4321, 6, 30, 884434);
check_date(4321, 7, 1, 884435);
check_date(4321, 7, 31, 884465);
check_date(4321, 8, 1, 884466);
check_date(4321, 8, 31, 884496);
check_date(4321, 9, 1, 884497);
check_date(4321, 9, 30, 884526);
check_date(4321, 10, 1, 884527);
check_date(4321, 10, 31, 884557);
check_date(4321, 11, 1, 884558);
check_date(4321, 11, 30, 884587);
check_date(4321, 12, 1, 884588);
check_date(4321, 12, 31, 884618);
check_date(9999, 1, 1, 2958101);
check_date(9999, 1, 31, 2958131);
check_date(9999, 2, 1, 2958132);
check_date(9999, 2, 28, 2958159);
check_date(9999, 3, 1, 2958160);
check_date(9999, 3, 31, 2958190);
check_date(9999, 4, 1, 2958191);
check_date(9999, 4, 30, 2958220);
check_date(9999, 5, 1, 2958221);
check_date(9999, 5, 31, 2958251);
check_date(9999, 6, 1, 2958252);
check_date(9999, 6, 30, 2958281);
check_date(9999, 7, 1, 2958282);
check_date(9999, 7, 31, 2958312);
check_date(9999, 8, 1, 2958313);
check_date(9999, 8, 31, 2958343);
check_date(9999, 9, 1, 2958344);
check_date(9999, 9, 30, 2958373);
check_date(9999, 10, 1, 2958374);
check_date(9999, 10, 31, 2958404);
check_date(9999, 11, 1, 2958405);
check_date(9999, 11, 30, 2958434);
check_date(9999, 12, 1, 2958435);
check_date(9999, 12, 31, 2958465);
}