Почему синтаксический анализ '23: 00 PM' с SimpleDateFormat ("чч: мм аа") возвращает 11 часов утра? - PullRequest
11 голосов
/ 20 июля 2009

Почему парсинг '23: 00 PM 'с SimpleDateFormat("hh:mm aa") возвращает 11:00. ?

Ответы [ 6 ]

22 голосов
/ 20 июля 2009

Вы должны получить исключение, поскольку «23:00 PM» не является допустимой строкой, но средство обработки даты / времени Java по умолчанию lenient , при обработке анализа даты.

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

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

17 голосов
/ 20 июля 2009

Вы хотите использовать формат "ЧЧ: мм аа", если будете анализировать 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
15 голосов
/ 20 июля 2009

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

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

4 голосов
/ 20 июля 2009

Вот параметры форматирования, указанные в 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) 

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

2 голосов
/ 20 июля 2009

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

1 голос
/ 20 июля 2009

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

hours = hours % 12;

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

...