1 回答

TA貢獻1799條經驗 獲得超9個贊
簡短的解決方案:
我建議使用能夠處理中國日歷的專用格式引擎,而不是嘗試依賴toString()
諸如此類的各種類型的方法。CyclicYear
Time4J 有自己的基于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 文檔可以在網上找到。該文檔已經包含格式化和解析中國日歷的示例。但我歡迎任何進一步的貢獻或改進它的具體建議。
添加回答
舉報