Проблема с анализом FastDateFormat

#java #datetime

#java #дата и время

Вопрос:

Я пытаюсь выполнить синтаксический анализ со FastDateFormat строками «0759» и «1401», но получаю ParsingException .

Он отлично работал SimpleDateFormat , но я хочу избежать его использования, поскольку он не является потокобезопасным. Я проверяю, находится ли текущее время в пределах определенного периода времени, чтобы предпринять дополнительные действия. Вместо этого я хочу использовать FastDateFormat приведенный ниже код. Пожалуйста, сообщите

 try{
SimpleDateFormat time_to_string = new SimpleDateFormat("HHmm");
        String executionEndTime = time_to_string.format(stepExecution.getEndTime());

        Date emailDeliveryStartTime =
                (Date) time_to_string.parse("0759");
        Date emailDeliveryEndTime =
                (Date) time_to_string.parse("1401");
        Date currentSystemTime = (Date) time_to_string.parse(executionEndTime);

        Calendar calendar1 = Calendar.getInstance();
        calendar1.setTime(emailDeliveryStartTime);

        Calendar calendar2 = Calendar.getInstance();
        calendar2.setTime(emailDeliveryEndTime);

        Calendar calendar3 = Calendar.getInstance();
        calendar3.setTime(currentSystemTime);

        Date isEmailTime = calendar3.getTime();

        if (isEmailTime.after(calendar1.getTime()) amp;amp; isEmailTime.before(calendar2.getTime())) {
            //return flowexecutionstatus 
        }
} catch (ParseException ex) {
        //log message
}
  

Комментарии:

1. какой тип данных возвращается stepExecution.getEndTime() ?

2. Это пакетное задание Spring. Итак, в StepExecution есть метод getEndTime(), который сообщает вам время завершения выполнения пакетного задания

3. если это так, почему вы преобразуете время в строку и снова обратно во время?

4. Таким образом, я могу быть преобразован в правильный формат. По крайней мере, это был мой мыслительный процесс, который может быть неправильным, но, кроме того, переход на FastDateFormat — это то, с чем я действительно ищу помощь.

Ответ №1:

Документация FastDateFormat.parse(String) состояний:

См. DateFormat.parse(String) DateFormat.parse(строка) , эквивалентная .для получения дополнительной информации.

Теперь документация DateFormat.parse(String) состояний:

Анализирует текст с начала заданной строки для получения даты.Метод может использовать не весь текст заданной строки.

См. Метод parse(String, ParsePosition) для получения дополнительной информации о разборе даты.

И документация parse(String, ParsePosition) состояний:

Эта операция синтаксического анализа использует calendar для получения даты. В результате поля calendar даты и времени и значение часового пояса могли быть перезаписаны в зависимости от реализаций подкласса.Любое значение часового пояса, которое ранее было установлено вызовом setTimeZone, может потребоваться восстановить для дальнейших операций.

Итак, из вышесказанного мы можем сделать вывод, что в FastDateFormat.parse(String) основном используется calendar объект, а затем перезаписывает поля даты и времени этого объекта, а затем генерирует Date из него объект.

Но есть тонкая разница в работе SimpleDateFormat.parse(String) . Переопределения parse(String) метода нет, но parse(String, ParsePostion) переопределен, и в его документации указано:

Эта операция синтаксического анализа использует календарь для получения даты. Все поля даты и времени календаря очищаются перед анализом, а значения полей даты и времени календаря по умолчанию используются для любой отсутствующей информации о дате и времени.Например, значение года анализируемой даты равно 1970 с GregorianCalendar, если в операции синтаксического анализа не задано значение года. Значение часового пояса может быть перезаписано в зависимости от заданного шаблона и значения часового пояса в тексте. Любое значение часового пояса, которое ранее было установлено вызовом setTimeZone, может потребоваться восстановить для дальнейших операций.

Другими словами, я чувствую, что SimpleDateFormat.parse(String) это может обеспечить желаемый результат, поскольку заменяет значения по умолчанию для отсутствующих полей, где as FastDateFormat.parse(String) не может выполнить синтаксический анализ, поскольку у вас есть отсутствующие поля в предоставленной вами строке даты и времени, которые он не может заменить.

Наконец, хотя вы не показали, как вы создали экземпляр FastDateFormat переменной. Если вы создали экземпляр как :

 FastDateFormat time_to_string = FastDateFormat.getInstance();
  

тогда я бы посоветовал вам использовать следующее:

 FastDateFormat time_to_string = FastDateFormat.getInstance("HHmm");