为了账号安全,请及时绑定邮箱和手机立即绑定

Java中将time4j转换的中文日期格式化为公历

Java中将time4j转换的中文日期格式化为公历

蓝山帝景 2023-09-06 15:58:02
我正在 Java 中开发一个项目,我需要相互更改不同类型的日期,例如(公历到中文,反之亦然,公历到回历,反之亦然)。我尝试使用Time4j,它具有将不同类型的日期相互转换的功能,但不幸的是,即使在尝试阅读其文档后,我也不明白如何使用该库。现在我正在尝试将公历日期转换为中国日期,但当我使用它返回循环年份时,我无法获得中国日期的正常年份,但我需要像 2019 年这样的正常年份。object.getYear()这是我的代码:import net.time4j.PlainDate;import net.time4j.calendar.ChineseCalendar;public class DateConverter {static PlainDate gregorian = PlainDate.nowInSystemTime();static ChineseCalendar obj = gregorian.transform(ChineseCalendar.axis());public static void main(String[] args) {    String result = obj.getMonth() + "/" + obj.getDayOfMonth() + "/" + obj.getYear() ;    System.out.println(result);         // 8/30/ji-hai(36)    System.out.println(obj);            // chinese[ji-hai(2019)-8-30]}}我需要这种类型的年份ji-hai(2019),它采用默认toString()方法,当我使用 object.getYear()方法时它返回 ji-hai(36)。现在如何将返回值从ji-hai(36)更改为ji-hai(2019)。另外,如果我想从用户那里接收公历日期,我应该如何准备此转换?我可以将其作为字符串文本接收并将其转换为公历日期然后使用它吗?有可能吗?另外,如果您知道一个很好的资源,可以通过示例解释 Time4j 的类和方法的用法,请与我分享。谢谢。
查看完整描述

1 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

简短的解决方案:

我建议使用能够处理中国日历的专用格式引擎,而不是尝试依赖toString()诸如此类的各种类型的方法。CyclicYearTime4J 有自己的基于ChronoFormatter类的格式引擎:

 ChineseCalendar obj = PlainDate.nowInSystemTime().transform(ChineseCalendar.axis());


    ChronoFormatter<ChineseCalendar> f =

        ChronoFormatter.ofPattern(

          "d/M/U(r)", 

          PatternType.CLDR, 

          Locale.ROOT, 

          ChineseCalendar.axis());


    System.out.println(f.print(obj));   

    // output today: 1/9/ji-hai(2019)

图案与中国年:

我使用了模式“d/M/U(r)”。中国历法的“正常”年份是由 CLDR 图案符号“U”表示的循环年。循环年在 60 年后重复,开始新的循环。年份的任何其他定义显然都是不寻常的。这可能会让西方用户感到惊讶,因为他们经常期望以向前的方式计算任何类型的预兆年份。但是,Time4J 还支持其他两种类型的年份。其中一个是现在仅具有历史意义的时代年份。另一种类型的年份是相关的公历年份(使用模式符号“r”)。其主要目的只是为了使循环年份明确。因此,许多人喜欢将中国年份构造为循环年份和相关公历年份的组合,形式如下:


U(r) or r(U)

甚至可以确定十二年后重复出现的十二生肖。假设您有一个中国日历对象,您可以通过以下方式确定十二生肖:


    String zodiac = obj.getYear().getZodiac(Locale.ENGLISH);

    System.out.println("Year of " + zodiac); // Year of Pig

反向方式(解析并转换为公历):

只需使用上面定义的格式化程序,然后解析:


    PlainDate gregorian = f.parse("1/9/ji-hai(2019)").transform(PlainDate.axis());

    System.out.println(gregorian); // output: 2019-09-29

关于转录:

我使用根区域设置来构建格式化程序。它以简单的拉丁字母生成循环年份,没有任何变音符号。如果您可能想使用官方拼音转录,您可以应用英语区域设置。循环年份将显示为“jǐ-hài”。中文(韩语和日语也使用相同的脚本)、越南语和俄语支持使用其他文字的特殊转录。


Time4J 的 API 文档可以在网上找到。该文档已经包含格式化和解析中国日历的示例。但我欢迎任何进一步的贡献或改进它的具体建议。


查看完整回答
反对 回复 2023-09-06
  • 1 回答
  • 0 关注
  • 122 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信