Невозможно преобразовать формат строки в дату Java.Время не идентифицируется как AM/PM
Вы спрашиваете о невозможном.Date
- это момент времени (внутренне реализованный как счетчик миллисекунд со времени так называемой эпохи), поэтому он «ничего не знает» о AM и PM в вашем часовом поясе.
Это то же самоетем не менее, потому что класс Date
всегда был плохо спроектирован и, к счастью, давно устарел.Вы не должны использовать его вообще.
java.time
java.time, современный Java-интерфейс даты и времени, который мы должны использовать вместо Date
, приближается к выполнению вашего требования,MC Emperor уже показал базовый код, необходимый для анализа вашей строки даты и времени.Вывод его кода:
2010-01-01T15: 23: 12Z
Здесь нет ни AM, ни PM.Когда мы печатаем OffsetDateTime
таким образом, его метод toString
вызывается неявно.Он создает строку в формате ISO 8601.ISO 8601 предписывает 24-часовые часы (без AM или PM). Но! С помощью правильного TemporalField
объекта OffsetDateTime
может вычислить и вернуть, находится ли он в AM или PM.time.get(ChronoField.AMPM_OF_DAY)
возвращает 0 для AM или 1 для PM:
System.out.println("AM or PM? 0 for AM. 1 for PM. time: "
+ time.get(ChronoField.AMPM_OF_DAY));
AM или PM?0 для утра.1 для вечера.время: 1
Так что в этом случае мы получили 1 за PM, как и ожидалось, поскольку в вашей исходной строке было PM
.
Я намеренно не ответил на все ваши вопросы, потому чтобольшая часть этого была рассмотрена в других вопросах переполнения стека и их ответах уже.Так что лучше хранить там информацию.Ниже приведены ссылки на пару соответствующих вопросов.
Что пошло не так в вашем коде?
В вашем коде есть как минимум две ошибки, каждая из которых приводит к неверному результату.Я попытался запустить ваш код в часовом поясе Америки / Лос-Анджелеса и получил
Пт 01 января 03:23:12 PST 2010
Время напечатано на 24-часовых часах.(Date
всегда так делает), поэтому мы получили 03:23:12 утра вместо вечера.И мы получили время в часовом поясе по умолчанию (PST для стандартного тихоокеанского времени), поэтому момент времени соответствует 11:23:12 AM со смещением +00: 00, смещение в строке.
- Неправильный часовой час происходит из-за противоречивых указаний в вашем коде:
HH
в строке шаблона формата соответствует часу дня с 00 по 23, поэтому 3
означает 03:00 и, очевидно, «выигрывает» надмаркер PM (для часа в пределах AM или PM от 1 до 12 вам потребуется строчная буква h
). - Часовой пояс по умолчанию определяется тем, что вы не пытаетесь проанализировать смещениеиз строки (в сочетании с
SimpleDateFormat
удовлетворением не разбора всей строки).
Ссылки