Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Вы хотите "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

Ответ 3

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

HH составляет 24 часа, а HH - 12.

Ответ 4

Вот параметры форматирования, указанные в 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". Но я не ожидал бы достоверных результатов, если вы введете невозможные данные.

Ответ 5

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

Ответ 6

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

hours = hours % 12;

чтобы часы находились в правильном диапазоне.