java.time и ThreeTenABP
java.time, современный Java-интерфейс даты и времени, предоставляет довольно естественный способ управления часовым поясом. Например:
ZoneId zone = ZoneId.of("Asia/Istanbul");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("M/d/uuuu&HH:mm");
String timeStamp = ZonedDateTime.now(zone).format(formatter );
System.out.println(timeStamp);
Когда я только что запустил этот фрагмент, вывод был:
6/6/2019 & 19: 53
Я не знаю, какой у вас часовой пояс, и надеюсь, что вы укажете правильный. Это имеет значение.
Вопрос: Могу ли я использовать java.time на Android?
Да, java.time прекрасно работает на старых и новых устройствах Android. Для этого требуется как минимум Java 6 .
- В Java 8 и более поздних версиях и на более новых устройствах Android (начиная с уровня API 26) встроен современный API.
- В Java 6 и 7 получите ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).
- На более старых версиях Android используется Android-версия ThreeTen Backport. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из
org.threeten.bp
с подпакетами.
Что пошло не так в вашем коде?
Как уже говорили другие, ваша проблема связана с часовым поясом. Очевидно, у вашего SimpleDateFormat
был установлен часовой пояс UTC. Когда вы не указываете часовой пояс, он выбирает свой часовой пояс из JVM, который, в свою очередь, обычно выбирает его из операционной системы, если не указано иное. То, что ваша JVM использует UTC, является стандартной практикой, поэтому неудивительно.
Во всяком случае, используемые вами классы datetime, SimpleDateFormat
и Calendar
, плохо спроектированы, первые особенно печально известны своими проблемами. К счастью, оба давно устарели. Вместо этого используйте java.time, современный Java API даты и времени.
Я только что заметил, что телефонный час тоже на 3 часа назад. Является
есть ли способ изменить это?
Скорее всего, часы системы телефона правильные (возможно, даже автоматически обновляются с сервера времени), но его часовой пояс установлен на UTC. В настройках телефона должен быть способ установить часовой пояс (тогда он, вероятно, также будет использоваться вашей JVM).
ISO 8601
Кроме того, ваш формат метки времени является своеобразным. Я рекомендую вам использовать стандартный формат, лучший ISO 8601, а также включить смещение в строку, чтобы, даже если часовой пояс был неправильным, время все равно было бы однозначным и правильным. Два примера. Сначала вы можете использовать UTC сознательно:
String timeStamp = Instant.now().toString();
2019-06-06T16: 57: 19.493599Z
Трейлинг Z
означает UTC.
Если вы хотите свой часовой пояс:
String timeStamp = OffsetDateTime.now(zone).toString();
2019-06-06T19: 58: 29,788376 + 03: 00
Ссылки