1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
extern crate chrono;
use chrono::prelude::*;
pub fn meiji() -> DateTime<Utc> {
Utc.ymd(1868, 9, 7).and_hms(15, 0, 0)
}
pub fn taisyo() -> DateTime<Utc> {
Utc.ymd(1912, 7, 29).and_hms(15, 0, 0)
}
pub fn showa() -> DateTime<Utc> {
Utc.ymd(1926, 12, 24).and_hms(15, 0, 0)
}
pub fn heisei() -> DateTime<Utc> {
Utc.ymd(1989, 1, 6).and_hms(15, 0, 0)
}
pub fn get_era<T: TimeZone>(dt: &DateTime<T>) -> Era {
let dt = dt.with_timezone(&Utc);
if dt < meiji() {
Era::PreMeiji
} else if dt < taisyo() {
Era::Meiji
} else if dt < showa() {
Era::Taisho
} else if dt < heisei() {
Era::Showa
} else {
Era::Heisei
}
}
pub fn get_year<T: TimeZone>(dt: &DateTime<T>) -> i64 {
let year = dt.year();
let res = match get_era(dt) {
Era::PreMeiji => year,
Era::Meiji => year - meiji().year() + 1,
Era::Taisho => year - taisyo().year() + 1,
Era::Showa => year - showa().year() + 1,
Era::Heisei => year - heisei().year() + 1,
};
res as i64
}
pub fn get_name<T: TimeZone>(dt: &DateTime<T>) -> &str {
match get_era(dt) {
Era::PreMeiji => "西暦",
Era::Meiji => "明治",
Era::Taisho => "大正",
Era::Showa => "昭和",
Era::Heisei => "平成",
}
}
pub fn get_short_name<T: TimeZone>(dt: &DateTime<T>) -> &str {
match get_era(dt) {
Era::PreMeiji => "西暦",
Era::Meiji => "明",
Era::Taisho => "大",
Era::Showa => "昭",
Era::Heisei => "平",
}
}
pub fn get_abbreviation_name<T: TimeZone>(dt: &DateTime<T>) -> &str {
match get_era(dt) {
Era::PreMeiji => "西暦",
Era::Meiji => "M",
Era::Taisho => "T",
Era::Showa => "S",
Era::Heisei => "H",
}
}
pub fn get_year_from_era(year: i64, era: Era) -> i64 {
let base = match era {
Era::PreMeiji => 1,
Era::Meiji => meiji().year(),
Era::Taisho => taisyo().year(),
Era::Showa => showa().year(),
Era::Heisei => heisei().year(),
};
((base - 1) as i64) + year
}
#[derive(Debug, Clone, PartialEq)]
pub enum Era {
PreMeiji,
Meiji,
Taisho,
Showa,
Heisei
}