Лучшее решение с использованием гибких значений по умолчанию (сегодня вместо 1970-01-01) будет в Java-8 с новой встроенной библиотекой времени-времени, расположенной в пакете java.time
:
String input = "12:32:21 JST";
String pattern = "HH:mm:ss z";
LocalDate today = LocalDate.now(ZoneId.of("Asia/Tokyo"));
DateTimeFormatter dtf =
new DateTimeFormatterBuilder().parseDefaulting(ChronoField.YEAR, today.getYear())
.parseDefaulting(ChronoField.MONTH_OF_YEAR, today.getMonthValue()).parseDefaulting(
ChronoField.DAY_OF_MONTH,
today.getDayOfMonth()
).appendPattern(pattern).toFormatter(Locale.ENGLISH);
ZonedDateTime zdt = ZonedDateTime.parse(input, dtf);
System.out.println(zdt); // 2016-12-23T12:32:21+09:00[Asia/Tokyo]
Тем не менее, я по-прежнему вижу небольшую ошибку, связанную с тем, что этот код делает обоснованное предположение о используемой зоне перед разбором реальной зоны, поэтому обращайтесь с осторожностью. Имейте в виду, что текущая дата зависит от зоны. Но, возможно, вам нужно всего лишь обработать сценарий, когда пользователи используют только японское время.
Подсказка: вы также можете разобрать в два этапа. Первый шаг с любой фиксированной датой по умолчанию, чтобы получить информацию о зоне текста, подлежащего анализу. И тогда вы можете использовать эту информацию о зоне для предлагаемого решения выше. Неловкая, но безопасная процедура.
'SimpleDateFormat' не поддерживает даты по умолчанию, или другими словами: 1970-01-01 единственная неподвижная по умолчанию дата для этого форматирования. Если вы хотите больше гибкости, вы можете использовать 'DateTimeFormatter' в Java-8. –