2015-11-09 4 views
4

У меня есть уникальная ситуация. Я работаю над старым проектом, который находится на старом сервере WebLogic, который (A) не пропускает ничего из Java 6, и (B) загрязняет загрузчик классов старой версией JodaTime (версия 1.2, если быть точным).Проверьте, есть ли DateTime в будущем со старой версией JodaTime

Клиент, с которым я работаю, имеет стандартную платформу разработки, включающую Java 8 и JodaTime для проектов, которые застряли в более ранних версиях Java. Поэтому я застрял, используя эту старую версию JodaTime (310-Backport - отличное решение, но мне не разрешено использовать его).

Мне нужно создать метод утилиты, который проверяет, есть ли DateTime после сегодняшнего дня (независимо от времени). JodaTime 1,2 не имеет LocalDate или удобные статические фабричные методы как now(), поэтому я пришел с этим:

public static boolean isAfterToday(DateTime dateTime) { 
    YearMonthDay date = new YearMonthDay(dateTime); 
    YearMonthDay today = new YearMonthDay(); 
    return date.isAfter(today); 
} 

Он чувствует себя немного неприглядное, потому что в более поздних версиях JodaTime, все в YearMonthDay классе было устарел и заменен LocalDate, который, к сожалению, я не могу использовать. Есть ли лучший способ сделать это? Кроме того, я пытаюсь снять время с DateTime, переведя его на YearMonthDay ... есть ли какие-либо «gotchas», которые я пропускаю или должен знать?

Несколько дополнительных заметок: Я предполагаю, что я уже проверил нулевой аргумент dateTime, и часовой пояс не должен быть проблемой, потому что все часовые пояса в приложении - GMT. Кроме того, I am разрешено использовать библиотеки Apache Commons и Guava.

ответ

1

Поскольку вы уверены, что все часовые пояса GMT, самая тривиальная реализация будет:

public static boolean isAfterToday(DateTime dateTime) { 
    String dateTimeStr = dateTime.toString("yyyy-MM-dd"); 
    String nowStr = new DateTime().toString("yyyy-MM-dd"); 
    return dateTimeStr.compareTo(nowStr) > 0; 
} 

Вы можете немного оптимизировать его так:

private static final DateTimeFormat yearMonthDay = DateTimeFormat.forPattern("yyyy-MM-dd"); 

public static boolean isAfterToday(DateTime dateTime) { 
    String dateTimeStr = yearMonthDay.print(dateTime); 
    String nowStr = yearMonthDay.print(new DateTime()); 
    return dateTimeStr.compareTo(nowStr) > 0; 
} 

Это решение развязывает вам немного от JodaTime таким образом, чтобы он не вводил другой тип даты/времени.

С другой стороны, неодобрение записка о YearMonthDay говорит

Использование LocalDate, который имеет гораздо более внутреннюю реализацию

так может быть, что это не совсем неправильно использовать его и я не предполагал бы, что вы столкнулись с любыми ошибками, используя его.

Предлагаю написать хороший (parameterized?) Комплект модульных тестов для этого метода и проверить поведение YearMonthDay. Если это работает, тогда идите с ним, если это не так, тогда попробуйте обходное решение toString().

+0

Интересно. Мне раньше не приходилось сравнивать строковое представление. Если годы не дополнены, это приведет к неправильным результатам в течение многих лет до 1000 г. н.э. или после 9999 г. н.э., но я не беспокоюсь об этом. –