Почему синтаксический анализ '23:00 вечера' с помощью SimpleDateFormat(“hh: mm aa”) возвращает 11 утра?

StackOverflow https://stackoverflow.com/questions/1154903

  •  18-09-2019
  •  | 
  •  

Вопрос

Почему синтаксический анализ '23:00 вечера' выполняется с SimpleDateFormat("hh:mm aa") вернуться в 11 утра?

Это было полезно?

Решение

Вы должны получать исключение, поскольку "23:00 PM" не является допустимой строкой, но функция даты и времени Java снисходительный по умолчанию, при обработке синтаксического анализа даты.

Логика заключается в том, что 23:00 вечера - это 12 часов после 11: 00 вечера, то есть 11:00 утра следующего дня.Вы также увидите, что такие вещи, как "31 апреля", анализируются как "1 мая" (через день после 30 апреля).

Если вы не хотите такого поведения, установите для свойства lenient значение false в вашем SimpleDateFormat, используя DateFormat#setLenient(логическое значение), и вы получите исключение при передаче недопустимой даты / времени.

Другие советы

Вы хотите использовать "HH: mm aa" в качестве вашего формата, если вы будете анализировать 24-часовое время.

public static void main(String[] args) throws ParseException {
    SimpleDateFormat df = new SimpleDateFormat("HH:mm aa");
    final Date date = df.parse("23:00 PM");
    System.out.println("date = " + df.format(date));
}

результаты

date = 23:00 PM

Вы пробовали HH:mm aa?

HH это на 24 часа, в то время как hh предназначено для 12.

Вот параметры форматирования , указанные в Javadoc

H     Hour in day (0-23)    
k   Hour in day (1-24)  
K   Hour in am/pm (0-11)    
h   Hour in am/pm (1-12) 

Обратите внимание, что "h" будет соответствовать часам 1-12.Если вы хотите обработать 1-24, попробуйте "k".для 0-23 попробуйте "H".Но я бы не ожидал достоверных результатов, если вы вводите невозможные данные.

23:00 вечера можно рассматривать как 11 утра на следующий день.Javascript и PHP работают примерно так же, но я не могу говорить за Java.

Я бы предположил, что это делает что-то вроде:

hours = hours % 12;

чтобы убедиться, что часы находятся в нужном диапазоне.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top