2015-03-12 3 views
1

Я пытаюсь преобразовать дату ISO (григорианский) в дату хиджри (исламский) и сравнить первое с датой хиджри.Почему для сравнения hijri с датами iso вам нужно обернуть DateTime в LocalDateTime? (Joda)

Что я делаю, и он не работает пока:

Chronology iso = ISOChronology.getInstanceUTC(); 
    Chronology hijri = IslamicChronology.getInstanceUTC(); 

    DateTime dtISO = new DateTime("2015-03-12T10:04:43", iso); 

    System.out.println("dtISO: " + dtISO); 
    DateTime toHijri = new DateTime(dtISO, hijri); 
    System.out.println("toHijri: " + toHijri); // 1436-05-21T10:04:43.000Z 
    DateTimeFormatter formatter = DateTimeFormat.forPattern("YYYY-MM-dd HH-mm"); 

    DateTime hijriDt = new DateTime(formatter.parseDateTime("1442-05-21 10-10"), iso); 

    if (hijriDt.isAfter(toHijri)) { 
     System.out.println("hijriDt date is after toHijri date"); 
    } 
    if (hijriDt.isBefore(toHijri)) { 
     System.out.println("hijriDt date is before toHijri date"); 
    } 
    if (hijriDt.isEqual(toHijri)) { 
     System.out.println("hijriDt date is equal toHijri date"); 
    } 

Независимо от того, что дата хиджры он всегда возвращает «Дата hijriDt раньше даты toHijri».

Теперь, когда я экспериментировал, я попытался это:

Chronology iso = ISOChronology.getInstanceUTC(); 
    Chronology hijri = IslamicChronology.getInstanceUTC(); 

    LocalDateTime toHijri = new LocalDateTime(new DateTime("2015-03-12T10:04:43", iso), hijri); 
    System.out.println("toHijri: " + toHijri); // 1436-05-21T10:04:43.000Z 
    DateTimeFormatter formatter = DateTimeFormat.forPattern("YYYY-MM-dd HH-mm"); 

    LocalDateTime hijriDt = new LocalDateTime(formatter.parseDateTime("1442-05-21 10-10"), iso); 

    if (hijriDt.isAfter(toHijri)) { 
     System.out.println("hijriDt date is after toHijri date"); 
    } 
    if (hijriDt.isBefore(toHijri)) { 
     System.out.println("hijriDt date is before toHijri date"); 
    } 
    if (hijriDt.isEqual(toHijri)) { 
     System.out.println("hijriDt date is equal toHijri date"); 
    } 

, который работает как шарм. Обратите внимание, как построена дата toHijri: LocalDateTime toHijri = new LocalDateTime (новый DateTime («2015-03-12T10: 04: 43», iso), hijri);

Экземпляр DateTime завернут внутри LocalDateTime.

Почему это происходит? Почему первый блок не работает?

ответ

3

Это не то, что вы хотите:

DateTime hijriDt = new DateTime(formatter.parseDateTime("1442-05-21 10-10"), iso); 

Это не с помощью календаря хиджры в любом месте:

  • Ваш форматировщик использует ISO (по умолчанию)
  • Вы разбор дата в году 1442 ISO, которая не то, что вы хотите
  • Вы затем «конвертируете» это в календарь ISO (который уже есть)
  • Ваше имя переменной предполагает, что вы ожидаете, что это будет в календаре Хиджры, но это не

Я подозреваю, что вы хотите:

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH-mm") 
    .withChronology(hijri); 
DateTime hijriDt = formatter.parseDateTime("1442-05-21 10-10"); 
+0

Спасибо за быстрый ответ. Вы знаете, почему работает второй блок? Является ли «LocalDateTime toHijri» обработанным как iso, хотя он был преобразован в хиджри? – ampofila

+0

@ampofila: Я подозреваю, что это не * действительно * работает - это просто дает вам сравнительный ответ, который вы ожидали. У меня нет времени, чтобы проверить, почему на данный момент, но это определенно не дата Hijri ... –

+0

Нашел. То, как сравниваются экземпляры LocalDateTime, отличается от экземпляров DateTime. Первое просто сравнивает каждое поле по порядку, от самого большого до самого маленького (из документов), а второе сравнивает миллисекунды. – ampofila

Смежные вопросы