String timeToConvert = "2018-06-25T08:06:52Z";
Instant inst = Instant.parse(timeToConvert);
LocalTime time = inst.atZone(ZoneId.of("Africa/Nairobi"))
.toLocalTime()
.truncatedTo(ChronoUnit.MINUTES);
System.out.println("Time in Nairobi: " + time);
Это печатает:
Время в Найроби: 11: 06
Я использую java.time
, в данном случае это бэкпорт для Java 6 и 7. Этот бэкпорт также доступен в версии для Android, которую вы можете использовать для низких уровней API Android. Мой импорт:
import org.threeten.bp.Instant;
import org.threeten.bp.LocalTime;
import org.threeten.bp.ZoneId;
import org.threeten.bp.temporal.ChronoUnit;
Если вам нужна строка времени для API, который требует этот формат, у вас все в порядке. Если вам требуется строка времени для представления пользователю, попробуйте вместо этого использовать встроенный формат Java:
DateTimeFormatter timeFormatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT);
ZonedDateTime dateTime = inst.atZone(ZoneId.of("Africa/Nairobi"));
System.out.println("Formatted: " + dateTime.format(timeFormatter));
Я попытался запустить это на языке суахили (sw_KE) и получил:
Отформатировано: 11:06
По-видимому, в этом языковом стандарте используется английский способ отметки времени AM / PM (я получил тот же результат в языковых стандартах Kikuyu и Kalenjin). В английской локали я получаю тот же формат, что и раньше:
Отформатировано: 11: 06
Я использую и предлагаю java.time
, современный Java-интерфейс даты и времени. Для тех, кто читает и использует Java 8 или более позднюю версию или программирует для Android API уровня 26 или более поздней, вам не требуется упомянутый бэкпорт. Просто импортируйте встроенные классы даты и времени из java.time
с подпакетами вместо вышеупомянутых.
Что пошло не так в вашем коде?
Ваша ошибка происходит из-за жесткого кодирования Z
в строке даты и времени в виде литерала. Это смещение UTC, равное нулю, и если вы не проанализируете его как таковой, строка даты и времени будет проанализирована в часовом поясе вашего SimpleDateFormat
, Африка / Найроби, что неправильно для вашей строки.
ИМХО, хотя вы вообще не должны использовать SimpleDateFormat
, TimeZone
и Date
. Эти классы давно устарели, и первый, в частности, оказался проблематичным. Я всегда использую java.time
вместо.
Еще один совет: не глотайте исключения. Не оставляйте свой блок catch
пустым. Сообщите об исключении некоторым заметным способом. Это ваш шанс узнать, что в вашем коде что-то не так.
Ссылки