Вы должны получить исключение, поскольку «23:00 PM» не является допустимой строкой, но средство обработки даты / времени Java по умолчанию lenient , при обработке анализа даты.
Логика такова, что 23:00 - это 12 часов после 23:00, то есть в 11:00 следующего дня. Вы также увидите, что «31 апреля» будет проанализировано как «1 мая» (один день после 30 апреля).
Если вам не нужно это поведение, установите для свойства lenient значение false на SimpleDateFormat, используя DateFormat # setLenient (boolean) , и вы получите исключение при передаче недопустимых даты / времени.