Форматирование даты преобразования китайского языка по time4j в григорианский язык в Java
Я работаю над проектом на Java, и мне нужно изменить разные типы дат друг на друга, например (с григорианского на китайский и наоборот и с григорианского на хиджри и наоборот). Я пытаюсь использовать Time4j, в котором есть эта возможность для преобразования разных типов дат друг в друга, но, к сожалению, я не понимал, как работать с этой библиотекой, даже после того, как попытался прочитать ее документацию.
Прямо сейчас я пытаюсь преобразовать григорианскую дату в китайскую дату, но я не могу получить нормальный год в китайской дате, когда используюobject.getYear()
он возвращает циклический год, но мне нужен обычный год, например, 2019.
Это мой код:
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]
}
}
Мне нужен этот тип года джи-хай (2019) и он по умолчаниюtoString()
метод и когда я использую object.getYear()
метод возвращает ji-hai(36).
Как теперь изменить возвращаемое значение с ji-hai(36) на ji-hai(2019). Также, если я хочу получить дату по григорианскому календарю от пользователя, как мне подготовиться к этому преобразованию? Могу ли я получить его как текст String и привести его к григорианской дате, а затем использовать? Это возможно?
Также, если вы знаете хороший ресурс, который объясняет использование классов и методов Time4j на примерах, поделитесь им со мной.
благодарю вас.
1 ответ
Краткое решение:
Вместо того, чтобы полагаться на 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)
Выкройка и китайские годы:
Я использовал узор "д / М / У (г)". "Нормальный" год китайского календаря ЯВЛЯЕТСЯ циклическим годом, представленным символом шаблона CLDR "U". Циклические годы повторяются через 60 лет, начиная новый цикл. Любое другое определение года явно необычно. Это может удивить западных пользователей, потому что они часто ожидают, что какой-либо пролептический год будет отсчитываться только вперед. Однако Time4J также поддерживает два других типа лет. Один из них - год эпохи, который сейчас представляет только исторический интерес. А другой тип года - это связанный с ним грегорианский год (с использованием символа шаблона "r"). Его основная цель - сделать циклический год однозначным. Следовательно, многие люди любят структурировать китайские годы как комбинацию циклического года и связанного с ним грегорианского года в такой форме:
U(r) or r(U)
Можно даже определить китайский зодиак, который повторяется всего через 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". Специальная транскрипция с использованием других сценариев поддерживается для китайского языка (такой же сценарий также для корейского и японского), вьетнамского и русского языков.
API-документацию Time4J можно найти в Интернете. Документ уже содержит примеры форматирования и анализа китайского календаря. Но я приветствую любые дальнейшие вклады в него или конкретные предложения по его улучшению.