#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");