2016-08-10 8 views
1

Я уже проверил множество решений в сети, но все же получил исключение при анализе «hh: mm a».Время обработки с помощью DateTimeFormatter «hh: mm a» причина Исключение

В JSP:

$('#t2').timepicker({ 
         timeFormat : 'hh:mm a', 
         interval : 30, 
         maxTime : '11:00 pm', 
         startTime : '08:00 am', 
         dynamic : false, 
         dropdown : true, 
         scrollbar : true 
        }); 

... 

            <div class="form-group"> 
             <label 
              class="col-md-3 control-label">Start 
              Time</label> 
             <div class="col-md-7"> 
              <input type="text" 
               class="timepicker" 
               id="t1" 
               name="startTime" 
               readonly="readonly"> 
             </div> 
            </div> 

В Java:

String startTime = request.getParameter("startTime"); 
DateTimeFormatter formatterTime1 = DateTimeFormatter.ofPattern("hh:mm a", Locale.US); 
LocalDateTime localStartTime = LocalDateTime.parse(startTime, formatterTime1); 

Исключение:

java.time.format.DateTimeParseException: Text '08:00 am' could not be parsed at index 6 

Даже когда я пытался жёстко:

String startTime = "08:00 am" (08:00am, 8:00am); 

У этой проблемы есть та же проблема. Даже в одном тестовом файле. Это потому, что Java 8 не может разобрать время только String?

ответ

4

В дополнение к ответу Meno «s, вы будете нуждаться в верхнем регистре AM или PM или регистронезависимы DateTimeFormatter, которые вы можете построить, как

String startTime = "08:00 am"; 
DateTimeFormatter formatterTime1 = new DateTimeFormatterBuilder() 
    .parseCaseInsensitive().appendPattern("hh:mm a").toFormatter(Locale.US); 
LocalTime localStartTime = LocalTime.parse(startTime, formatterTime1); 
3

Вы можете разобрать «hh: mm a» на LocalTime, но не на LocalDateTime, потому что нет информации о дате. Почему парсер дико угадывает любую произвольную дату для вас? Мое предложение оставить выбор какую дату выбрать:

LocalTime localStartTime = LocalTime.parse(startTime, formatterTime1); 
LocalDateTime ldt = LocalDate.of(...).atTime(localStartTime); 

В отличие от старого SimpleDateFormat использует дату по умолчанию 1970-01-01, дата UNIX эпохи. Но я не думаю, что это разумное дизайнерское решение старого API и было мотивировано разбором на мгновенный экземпляр java.util.Date (из-за отсутствия времени только типа типа LocalTime).

1

Есть два вопроса, как было упомянуто Мено

  • Вы используете LocalDateTime вместо LocalTime
  • Образец буквы 'a' означает, что вам нужно указать AM/PM в uppercas е, если вы не используете DateTimeFormatterBuilder Ex:

    LocalTime localStartTime = LocalTime.parse("08:00 AM", formatterTime1);