#iso-8601 #date #calendar #wareki #jis-x-0301

nightly wareki-conv

将和暦(JIS X 0301)日期转换为 ISO 8601 日期

3 个不稳定版本

0.2.1 2024年2月20日
0.2.0 2024年2月20日
0.1.0 2024年2月17日

#1323 in 解析实现

Download history 48/week @ 2024-04-17 35/week @ 2024-04-24 2/week @ 2024-06-26 44/week @ 2024-07-03 5/week @ 2024-07-24

每月 51 次下载

MIT 许可证

21KB
273

wareki-conv

将日本和暦日期(JIS X 0301)转换为基于 ISO 8601 的格式。

[!注意]

和暦指的是日本特有的日历,时间基于称为“元号”的皇帝年号和后续年份划分。

JIS X 0301 中和暦是如何定义的?

根据 维基百科,[^1]

[^1]: 截至 Fri Feb 16 02:41:00 AM JST 2024

日本 (JIS X 0301)

存在日本工业标准 JIS X 0301(旧 JIS C 6262),其中包含了 ISO 8601:2000 的翻译,收录在 JIS X 0301:2002「为信息交换的数据元素及交换格式 — 日期和时间的表示」(日本工业标准调查会、经济产业省)(英文标题与 ISO 8601 相同)中。

标准中规定了“基于元号的日期”(和暦)。元号是“明”“大”“昭”“平”“令”或“M”“T”“S”“H”“R”,并用元字符 N 表示。对于明治之前的元号没有规定。

日期以基本格式“YY.MM.DD”或扩展格式“NYY.MM.DD”表示(元号中的年也是“YY”)。此时,年月日为两位数,第一位数字不能省略。年月日的分隔符是点而不是破折号(例如,公历年月日为2019-06-23,使用破折号分隔)。此点在基本格式中也不能省略。

  • 示例
    • H16.04.01R02.06.23
    • 平16.04.01令02.06.23

使用公历表示日期和时间的组合(例如:2021-10-27T15:48:10.78)在元号使用情况下未作规定。也就是说,R02.06.23T15:48:10.78 的这种表示是否允许没有规定。

在格里历改元之前的和暦(M06.01.01,即1873-01-01)是阴阳历(旧历),此规范范围之外。M01.01.01 至 M05.12.02 规定表示 1868 年 1 月 25 日至 1872 年 12 月 31 日,(与儒略历时代的公历日期处理不同) 不是作为格里历解释。此外,基于立年改元,明治的开始是 M01.01.01。

更多详情,见 https://kikakurui.com/x0/X0301-2019-01.html

此库的范围

基于 JIS X 0301 的定义,我们将转换以下格式:

  • YY.MM.DD(JIS X 0301 基本格式)
  • NYY.MM.DD(JIS X 0301 扩展格式,其中 N 是元字符)

为以下格式:

YYYY-MM-DD(ISO 8601 扩展格式)。

在JIS X 0301标准的基础上,为了实用还实现了一些附加功能。

  • 接受全角数字
    • 全角数字也和半角数字一起使用。
  • 接受非0填充的模式
    • 在实际应用中,通常省略前导0。
  • 接受元年表示法 "元年"
    • 注意:在日本历法系统中,每个元号的第一年有时用 "元年" 而不是 <元号>1年 来表示。

也可以转换最常用的格式,如 平成5年2月3日 (<元号>YY年MM月DD日)

示例

fn test_assert(s: &str, ymd: (i32, u32, u32)) {
    assert_eq!(
        convert(s).unwrap(),
        Some(Utc.with_ymd_and_hms(ymd.0, ymd.1, ymd.2, 0, 0, 0).unwrap())
    )
}

// DateType::JisX0301Basic
test_assert("01.02.03", (2019, 2, 3));
test_assert("1.2.3", (2019, 2, 3));
test_assert("10.02.03", (2028, 2, 3));
test_assert("06.2.3", (2024, 2, 3));
test_assert("06.02.03", (2024, 2, 3));

// DateType::JisX0301Extended
test_assert("R01.02.03", (2019, 2, 3));
test_assert("R10.2.3", (2028, 2, 3));
test_assert("M01.02.03", (1868, 2, 3));
test_assert("M45.2.3", (1912, 2, 3));
test_assert("T01.02.03", (1912, 2, 3));
test_assert("S01.2.3", (1926, 2, 3));
test_assert("H01.02.03", (1989, 2, 3));
test_assert("H01.02.03", (1989, 2, 3));

// DateType::JisX0301ExtendedWithKanji
test_assert("令01.02.03", (2019, 2, 3));
test_assert("令1.2.3", (2019, 2, 3));
test_assert("明01.02.03", (1868, 2, 3));
test_assert("大01.2.3", (1912, 2, 3));
test_assert("昭01.02.03", (1926, 2, 3));
test_assert("平01.2.3", (1989, 2, 3));
test_assert("平01.02.03", (1989, 2, 3));

// DateType::SeparatedWithKanji
test_assert("令和1年2月3日", (2019, 2, 3));
test_assert("明治1年2月3日", (1868, 2, 3));
test_assert("大正1年2月3日", (1912, 2, 3));
test_assert("昭和1年2月3日", (1926, 2, 3));
test_assert("平成1年2月3日", (1989, 2, 3));
test_assert("平成1年2月3日", (1989, 2, 3));
test_assert("平成元年2月3日", (1989, 2, 3));

备注

实际上,每个元号的第一天并不是1月1日,而且每个元号都有所不同。例如,平成的第一天是1月8日。这个库不考虑这种条件,并假设输入值是正确的。

依赖项

~7.5MB
~124K SLoC