era_jp/
lib.rs

1//! Japanese Era Library
2
3use chrono::prelude::*;
4
5/// Start Meiji Era
6pub fn meiji() -> DateTime<Utc> {
7    Utc.ymd(1868, 9, 7).and_hms(15, 0, 0)
8}
9
10/// Start Tasho Era
11pub fn taisyo() -> DateTime<Utc> {
12    Utc.ymd(1912, 7, 29).and_hms(15, 0, 0)
13}
14
15/// Start Showa Era
16pub fn showa() -> DateTime<Utc> {
17    Utc.ymd(1926, 12, 24).and_hms(15, 0, 0)
18}
19
20/// Start Heisei Era
21pub fn heisei() -> DateTime<Utc> {
22    Utc.ymd(1989, 1, 6).and_hms(15, 0, 0)
23}
24
25/// Start Reiwa Era
26pub fn reiwa() -> DateTime<Utc> {
27    Utc.ymd(2019, 4, 30).and_hms(15, 0, 0)
28}
29
30/// get era from datetime
31pub 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
48/// get era year
49pub 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
62/// get full name
63pub 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
74/// get short name
75pub 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
86/// get ligature
87pub 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
98/// get abbrevivation name
99pub 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
110/// get year from era
111pub 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}