Форматирование китайских конвертированных дат по времени 4j в григорианский в Java - PullRequest
2 голосов
/ 29 сентября 2019

Я работаю над проектом на 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]
}
}

Мне нужен этот тип года ji-hai (2019) , и это метод по умолчанию toString() и когдаЯ использую object.getYear() метод, он возвращает ji-hai (36) .

Теперь, как я могу изменить свое возвращаемое значение с ji-hai (36) на джи-хаи (2019) .Также, если я хочу получить григорианскую дату от пользователя, как я должен подготовиться к этой конверсии?Могу ли я получить его в виде строкового текста и привести его к григорианской дате, а затем использовать его?Возможно ли это?

Также, если вы знаете хороший ресурс, который объясняет использование классов и методов Time4j с примером, пожалуйста, поделитесь им со мной.

спасибо.

1 Ответ

3 голосов
/ 29 сентября 2019

Краткое решение:

Вместо того чтобы пытаться полагаться на 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 (р)".«Нормальный» год китайского календаря - это циклический год, представленный символом шаблона 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 можно найти online .Документ уже содержит примеры для форматирования и анализа китайского календаря.Но я приветствую любые дальнейшие вклады или конкретные предложения по его улучшению.

...