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

用Java将time4j转换的中文日期格式化为公历,java,calendar,chinese-locale,time4j,Java,Calendar,Chinese Locale,Time4j,我正在用Java做一个项目,我需要互相更改不同类型的日期,如(格里高利到中文,反之亦然,格里高利到Hijri,反之亦然)。我尝试使用Time4j,它具有将不同类型的日期相互转换的功能,但不幸的是,即使在我尝试阅读其文档后,我也不知道如何使用该库 现在我正在尝试将公历日期转换为中文日期,但当我使用object.getYear()时,我无法获取中文日期中的正常年份 这是我的代码: import net.time4j.PlainDate; import net.time4j.calendar.Chin

我正在用Java做一个项目,我需要互相更改不同类型的日期,如(格里高利到中文,反之亦然,格里高利到Hijri,反之亦然)。我尝试使用Time4j,它具有将不同类型的日期相互转换的功能,但不幸的是,即使在我尝试阅读其文档后,我也不知道如何使用该库

现在我正在尝试将公历日期转换为中文日期,但当我使用
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)

现在我如何将我的返回值从季海(36)更改为季海(2019)。此外,如果我想从用户处收到公历日期,我应该如何准备此转换?我可以将其作为字符串文本接收,并将其转换为公历日期,然后使用它吗?有可能吗

另外,如果你知道一个很好的资源,用例子解释Time4j类和方法的用法,请与我分享

谢谢。

简短解决方案: 我建议使用能够处理中文日历的专用格式引擎,而不是试图依赖各种类型的
toString()
-方法,如
CyclicYear
等。Time4J有自己的基于类的格式引擎:

甚至可以确定12年后重复的中国生肖。如果您有一个中国日历对象,您可以通过以下方式确定黄道带:

    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文档。该文档已经包含了格式化和解析中国日历的示例。但我欢迎对它的进一步贡献或改进它的具体建议。

非常感谢您提供的全面信息。我只想提到解析和转换为gregorian会引发异常。(语法异常:需要数字)。为什么会发生这种情况,我可以以相同的方式将所有其他可用的日期类型彼此更改,或者每种类型的日期都有自己的转换方法,其工作方式不同?@AliDK a)是的,解析方法声明为抛出选中的
ParseException'。如果您有一个解析问题,那么您可以打开另一个描述您的输入的问题,并提供一个可编译和可复制的示例,然后我可以再次回答。b) 关于转换,方法
transform()'接受与任何
日历
类型兼容的
年表
类型的参数,因此您可以转换为
中文日历
明文
(格里高利)、
波斯日历
等。另请参见@AliDK解析中的错误消息(需要数字)您的报告似乎表明您的模式和要解析的输入之间不匹配。
    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