java.time
java.time, современный API даты и времени Java, может сделать это:
DateTimeFormatter hijrahFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy")
.withChronology(HijrahChronology.INSTANCE);
try {
HijrahDate date = hijrahFormatter.parse("30/02/1403", HijrahDate::from);
System.out.println("A valid date: " + date);
} catch (DateTimeParseException dtpe) {
System.out.println("Not a valid date: " + dtpe.getMessage());
}
Вывод этого фрагмента:
Действительная дата: хиджра-умалькура AH 1403-02-30
Буквы шаблона формата чувствительны к регистру. Вам нужен нижний регистр yyyy
для календарного года (или uuuu
для года, когда наступил приступ).
Java 6? Три варианта.
Я хочу проверить в Java 6. Я не могу использовать в Java 8.
Это старое сейчас (Java 11 вышла). Мои предложения:
- Используйте ThreeTen Backport, бэкпорт java.time для Java 6 и 7. Оказывается, он не работает идеально для вашего случая, но вы можете.
- Используйте Joda-Time, как вы и просили с самого начала.
- Использовать Time4J.
Первые два варианта отклонят вашу дату 30/02/1403, хотя, полагая, что во втором месяце 1403 года осталось только 29 дней.
ThreeTen Backport
DateTimeFormatter hijrahFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu")
.withChronology(HijrahChronology.INSTANCE);
String dateString = "30/02/1403";
try {
TemporalAccessor parsed = hijrahFormatter.parse(dateString);
HijrahDate date = HijrahChronology.INSTANCE.date(parsed.get(ChronoField.YEAR),
parsed.get(ChronoField.MONTH_OF_YEAR),
parsed.get(ChronoField.DAY_OF_MONTH));
if (date.format(hijrahFormatter).equals(dateString)) {
System.out.println("A valid date: " + date);
} else {
System.out.println("Not a valid date: " + dateString);
}
} catch (DateTimeParseException dtpe) {
System.out.println("Not a valid date: " + dtpe.getMessage());
}
Выход:
Недействительная дата: 30/02/1403
Насколько я понимаю, следующий простой способ построения даты должен работать, но не работает:
HijrahDate date = HijrahDate.from(parsed);
Я получаю org.threeten.bp.DateTimeException: Field not found: EpochDay
. Вместо этого я строю дату так, что она принимает, что день месяца выходит за пределы допустимого диапазона, и выдает дату Hijrah-umalqura AH 1403-03-01
. Поэтому для завершения проверки я форматирую дату назад и требую, чтобы я снова получил исходную строку.
Если вместо 30/02/1403
я попробую с 29/02/1403
, я получу
Действительная дата: хиджра-умалькура AH 1403-02-29
Joda-Time
DateTimeFormatter islamicFormatter = DateTimeFormat.forPattern("dd/MM/yyyy")
.withChronology(IslamicChronology.getInstance());
try {
LocalDate date = LocalDate.parse("30/02/1403", islamicFormatter);
System.out.println("A valid date: " + date);
} catch (IllegalArgumentException iae) {
System.out.println("Not a valid date: " + iae.getMessage());
}
Joda-Time также считает, что в этом месяце 29 дней, и очень ясно заявляет:
Недопустимая дата: невозможно проанализировать "30/02/1403": значение 30 для dayOfMonth
должно быть в диапазоне [1,29]
со строкой 29/02/1403
Я получил:
Действительная дата: 1403-02-29
Исламская хронология Joda-Time включает четыре различных образца високосного года. Я попробовал все четыре. Все они дают 29 дней во втором месяце 1403 года. Извините, это настолько близко, насколько я могу.
С домашней страницы Joda-Time:
Обратите внимание, что Joda-Time считается в значительной степени «законченным» проектом.
Никаких серьезных улучшений не планируется. Если вы используете Java SE 8, пожалуйста, перенесите
до java.time
(JSR-310).
Time4J
Я отсылаю вас к знающему ответу Мено Хохшильда, автора Time4J. Мне кажется, что Time4J версии 3.50 решает вашу проблему в соответствии с вашими требованиями и на Java 6.
Но эта дата действительна или нет?
Но если вы проверите исламский календарь, это действительная дата 2-го месяца.
Вы гораздо больше эксперт, чем я. Кажется, я понимаю, что существуют варианты календаря хиджры. По вашему варианту 30/02/1403 - это совершенно действительная дата. Версия, предоставленная исламскими веб-службами alhabib, совпадает с вашей версией: Safar 30, 1403 - это тот же день, что и 16 декабря 1982 года в григорианском календаре. С другой стороны, согласно searchtruth.com, в месяце Safar 1403 есть только 29 дней (Safar 29, 1403 соответствует 15 декабря 1982 г. по григорианскому языку, а за ним следует Rabi Al-Awwal 1, 1403, соответствующий 16 декабря).
Ссылки