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
//! Japanese Era Library
extern crate chrono;
use chrono::prelude::*;

/// Start Meiji Era
pub fn meiji() -> DateTime<Utc> {
    Utc.ymd(1868, 9, 7).and_hms(15, 0, 0)
}

/// Start Tasho Era
pub fn taisyo() -> DateTime<Utc> {
    Utc.ymd(1912, 7, 29).and_hms(15, 0, 0)
}

/// Start Showa Era
pub fn showa() -> DateTime<Utc> {
    Utc.ymd(1926, 12, 24).and_hms(15, 0, 0)
}

/// Start Heisei Era
pub fn heisei() -> DateTime<Utc> {
    Utc.ymd(1989, 1, 6).and_hms(15, 0, 0)
}

/// get era from datetime
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
    }
}

/// get era year
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
}

/// get full name
pub fn get_name<T: TimeZone>(dt: &DateTime<T>) -> &str {
    match get_era(dt) {
        Era::PreMeiji => "西暦",
        Era::Meiji => "明治",
        Era::Taisho => "大正",
        Era::Showa => "昭和",
        Era::Heisei => "平成",
    }
}

/// get short name
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 => "平",
    }
}

/// get abbrevivation name
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",
    }
}

/// get year from era
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
}