1use chrono::prelude::*;
4
5pub fn meiji() -> DateTime<Utc> {
7 Utc.ymd(1868, 9, 7).and_hms(15, 0, 0)
8}
9
10pub fn taisyo() -> DateTime<Utc> {
12 Utc.ymd(1912, 7, 29).and_hms(15, 0, 0)
13}
14
15pub fn showa() -> DateTime<Utc> {
17 Utc.ymd(1926, 12, 24).and_hms(15, 0, 0)
18}
19
20pub fn heisei() -> DateTime<Utc> {
22 Utc.ymd(1989, 1, 6).and_hms(15, 0, 0)
23}
24
25pub fn reiwa() -> DateTime<Utc> {
27 Utc.ymd(2019, 4, 30).and_hms(15, 0, 0)
28}
29
30pub fn get_era<T: TimeZone>(dt: &DateTime<T>) -> Era {
32 let dt = dt.with_timezone(&Utc);
33 if dt < meiji() {
34 Era::PreMeiji
35 } else if dt < taisyo() {
36 Era::Meiji
37 } else if dt < showa() {
38 Era::Taisho
39 } else if dt < heisei() {
40 Era::Showa
41 } else if dt < reiwa() {
42 Era::Heisei
43 } else {
44 Era::Reiwa
45 }
46}
47
48pub fn get_year<T: TimeZone>(dt: &DateTime<T>) -> i64 {
50 let year = dt.year();
51 let res = match get_era(dt) {
52 Era::PreMeiji => year,
53 Era::Meiji => year - meiji().year() + 1,
54 Era::Taisho => year - taisyo().year() + 1,
55 Era::Showa => year - showa().year() + 1,
56 Era::Heisei => year - heisei().year() + 1,
57 Era::Reiwa => year - reiwa().year() + 1,
58 };
59 res as i64
60}
61
62pub fn get_name<T: TimeZone>(dt: &DateTime<T>) -> &str {
64 match get_era(dt) {
65 Era::PreMeiji => "西暦",
66 Era::Meiji => "明治",
67 Era::Taisho => "大正",
68 Era::Showa => "昭和",
69 Era::Heisei => "平成",
70 Era::Reiwa => "令和",
71 }
72}
73
74pub fn get_short_name<T: TimeZone>(dt: &DateTime<T>) -> &str {
76 match get_era(dt) {
77 Era::PreMeiji => "西暦",
78 Era::Meiji => "明",
79 Era::Taisho => "大",
80 Era::Showa => "昭",
81 Era::Heisei => "平",
82 Era::Reiwa => "令",
83 }
84}
85
86pub fn get_ligature<T: TimeZone>(dt: &DateTime<T>) -> &str {
88 match get_era(dt) {
89 Era::PreMeiji => "西暦",
90 Era::Meiji => "\u{337E}",
91 Era::Taisho => "\u{337D}",
92 Era::Showa => "\u{337C}",
93 Era::Heisei => "\u{337B}",
94 Era::Reiwa => "\u{32FF}",
95 }
96}
97
98pub fn get_abbreviation_name<T: TimeZone>(dt: &DateTime<T>) -> &str {
100 match get_era(dt) {
101 Era::PreMeiji => "西暦",
102 Era::Meiji => "M",
103 Era::Taisho => "T",
104 Era::Showa => "S",
105 Era::Heisei => "H",
106 Era::Reiwa => "R",
107 }
108}
109
110pub fn get_year_from_era(year: i64, era: Era) -> i64 {
112 let base = match era {
113 Era::PreMeiji => 1,
114 Era::Meiji => meiji().year(),
115 Era::Taisho => taisyo().year(),
116 Era::Showa => showa().year(),
117 Era::Heisei => heisei().year(),
118 Era::Reiwa => reiwa().year(),
119 };
120 ((base - 1) as i64) + year
121}
122
123#[derive(Debug, Clone, PartialEq)]
124pub enum Era {
125 PreMeiji,
126 Meiji,
127 Taisho,
128 Showa,
129 Heisei,
130 Reiwa,
131}