3 个不稳定版本
0.2.1 | 2024年2月20日 |
---|---|
0.2.0 | 2024年2月20日 |
0.1.0 | 2024年2月17日 |
#1323 in 解析实现
每月 51 次下载
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.01
、R02.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