Android utc to date

Разобрать формат времени UTC в удобочитаемую дату и время в Android

У меня есть дата и время UTC в формате 2019-12-06T06:04:50.022461Z , который я хочу преобразовать в читаемую дату и время в формате dd-mm-yyyy hh:mm:ss . Я не могу конвертировать в определенном формате. Любая помощь будет высоко оценена. Благодарность

3 ответа

Вы можете использовать SimpleDateFormat для форматирования даты. Проверьте ниже:

Вы можете попробовать это в Java 8

Java.time и ThreeTenABP

Я предполагаю, что вы хотите отобразить время в часовом поясе вашего пользователя. Как вы уже сказали, ваша строка в формате UTC, и очень немногие пользователи будут рады узнать время в формате UTC.

Ради примера я запустил этот код в часовом поясе Америка / Ситка. Выход был:

Если вы хотите отобразить время в формате UTC, как в исходной строке:

Не используйте классы SimpleDateFormat , TimeZone и Calendar , использованные в принятом в настоящее время ответе. Все они плохо спроектированы, SimpleDateFormat , в частности, является печально известным нарушителем спокойствия и также не может анализировать 6 десятичных знаков в секундах, как в вашей строке. Эти три класса также все давно устарели. Вместо этого я использую java.time, современный API даты и времени Java. С ним гораздо приятнее работать. Код не только короче, я думаю, что вам также будет удобнее читать (сразу или когда вы привыкнете к свободному стилю).

Я использую тот факт, что ваша исходная строка имеет формат ISO 8601. Классы java.time анализируют формат ISO 8601 по умолчанию, то есть без какого-либо явного средства форматирования.

Однако для подавляющего большинства целей не требуется преобразовывать один формат строки в другой. Внутри вашей программы сохраняйте дату и время как Instant или другой подходящий объект даты / времени. конвертировать в строку только тогда, когда в интерфейсе нужна строка.

Источник

Java 8 – Parse string to date-time in UTC

Learn to parse a given date time string to instance e.g. ZonedDateTime or OffsetDateTime classes, using DateTimeFormatter class in Java 8.

1. Instant, OffsetDateTime and ZonedDateTime

In Java 8, OffsetDateTime , ZonedDateTime and Instant – all store an instant on the time-line to nanosecond precision. Instant is the simplest, simply representing the epoch-seconds (without offset information). OffsetDateTime adds to the instant the offset from UTC, which allows the local date-time to be obtained. ZonedDateTime uses full time-zone rules while handling dates.

  • Use Instant to record event time-stamps in the application.
  • Use OffsetDateTime when modeling date-time concepts in more detail, or when communicating to a database or in a network protocol.
  • Use ZonedDateTime for displaying the time in UI. It honors DST (Daylight Saving Time) rules.

2. Parse string to OffsetDateTime in UTC

Date time with offset information is represented in dd/MM/uuuu’T’HH:mm:ss:SSSXXXXX pattern. e.g. «03/08/2019T16:20:17:717+05:30» . In this example, timestamp represents one instant at «+05:30» offset.

Java program to convert string to OffsetDateTime and get equivalent instant in UTC.

‘Z’ in date string represents the UTC timezone. It is short form of Zulu and can be written as UTC +0:00 .

3. Parse string to ZonedDateTime in UTC

Date time with full zone information is represented in following formats.

Читайте также:  Не могу включить андроид для разблокировки

dd/MM/uuuu’T’HH:mm:ss:SSSXXXXX pattern. e.g. «03/08/2019T16:20:17:717+05:30» .
MM/dd/yyyy’T’HH:mm:ss:SSS z pattern. e.g. «08/03/2019T16:20:17:717 UTC+05:30» .

In this example, timestamp represents one instant at «+05:30» offset i.e. IST.

Java program to convert string to ZonedDateTime and get equivalent instant in UTC.

Drop me your questions related parsing string to ZonedDateTime or OffsetDateTime in UTC.

Источник

Как преобразовать LocalDateTime в UTC и обратно без загрузки зон?

Задний план

Я использую backport threetenbp для Android ( здесь ) для обработки различных операций с данными, связанными со временем.

Один из них — преобразовать время в другой часовой пояс (текущий в UTC и обратно).

Я знаю, что это возможно, если вы используете что-то вроде этого:

Это отлично работает, и довольно легко сделать наоборот.

Проблема

Я стараюсь избегать инициализации библиотеки, которая загружает в нее довольно большой файл зон. Я уже понял, как обрабатывать различные операции, связанные с датой / временем, без этого, за исключением этого случая преобразования в UTC и обратно.

То, что я получил, имеет ошибку на целый час после правильного преобразования.

Что я пробовал

Вот что я нашел и попробовал:

Вопрос

Что именно не так с тем, что я написал? Как мне получить альтернативный код для преобразования времени без инициализации библиотеки?

Учитывая экземпляр LocalDateTime в качестве входных данных, как я могу преобразовать его из текущего часового пояса в UTC и из UTC в текущий часовой пояс?

2 ответа

Вероятно, это происходит потому, что часовой пояс вашей JVM по умолчанию находится в переходе на летнее время (DST).

Чтобы получить правильное смещение, вы должны проверить, находится ли часовой пояс в DST, и добавить это к смещению:

Другой способ создать nowInUtc как LocalDateTime — создать Instant из Calendar :

На самом деле, вам вообще не нужен Calendar , просто используйте Instant.now() , чтобы получить текущий момент:

Или, что еще короче, используйте напрямую OffsetDateTime :

Не уверен, загружает ли какой-либо из этих часовых поясов данные о часовых поясах, вам решать.

И я думаю , что константу ZoneOffset.UTC можно использовать вместо ZoneOffset.ofHours(0) , потому что она также не загружает tz-данные (но я ее не тестировал).

Окончательное решение

Предполагая, что часовой пояс по умолчанию находится в Израиле ( TimeZone.getDefault() равен Asia/Jerusalem ):

Ответ carlBjqsd в порядке, просто неудобен и, возможно, должен быть немного яснее.

Почему разница в один час

См. Окончательное решение @carlBjqsd: в нем используется выражение

int offset = zone.getOffset(1, now.getYear(), now.getMonthValue() — 1, now.getDayOfMonth(), dayOfWeek, now.getNano() / 1000000);

Вы заметили разницу в один час. Приложениям обычно не требуется вычислять только с необработанным смещением, которое не учитывает смещение dst для некоторых периодов года. При преобразовании местной метки времени в UTC и обратно имеет значение только общее смещение. Основная цель точной дифференциации частичных смещений, таких как необработанные смещения или смещения dst, — это просто правильное наименование зона (называть это стандартным временем или нет?).

Вводящее в заблуждение название вопроса: «без зон загрузки»

Нет , вы никогда не сможете избежать загрузки зон, если хотите конвертировать между местными отметками времени и UTC с использованием зон. Ваш настоящий вопрос, скорее, таков: Как избежать загрузки зон ThreetenABP и вместо этого использовать / загружать зоны платформы Android. И ваша мотивация, похоже, следующая:

Я пытаюсь избежать инициализации библиотеки, которая загружает в нее довольно большой файл зон

Ну, я не измерял, какие данные зоны больше влияют на производительность. Я могу только сказать, основываясь на моих исследованиях и знании исходного кода задействованных библиотек, что java.time и ThreetenBP загружают весь файл TZDB.dat в кеш двоичного массива в памяти (в качестве первого шага), а затем выбирают соответствующая часть для отдельной зоны (т.е. интерпретировать часть массива двоичных данных посредством десериализации в набор правил зоны и, наконец, в один ZoneId ). Вместо этого старые платформы Java работают с набором разных zi-файлов (по одному для каждой зоны), и я подозреваю, что зоны Android ведут себя аналогичным образом (но, пожалуйста, поправьте меня, если вы знаете эту деталь лучше).

Читайте также:  Identifier expected android studio

Если вообще должна использоваться только ОДНА зона, тогда традиционный подход с использованием отдельных файлов зон может быть лучше, но если вы захотите перебрать все доступные зоны, тогда лучше иметь только один файл зоны.

Лично я считаю, что аспектом производительности пренебречь. Если вы используете зоны Android, у вас также неизбежно будет некоторое время загрузки. Если вы действительно хотите ускорить время инициализации ThreetenABP, вам следует подумать о том, чтобы загрузить его в фоновом потоке.

Эквивалентны ли зоны Android и зоны ThreetenABP?

Как правило, нет. Оба репозитория часовых поясов могут давать одинаковое смещение для конкретной зоны. И часто они это делают, но иногда будут возникать различия, которые вы не можете контролировать. Хотя оба репозитория часовых поясов в конечном итоге используют данные iana.org/tz, различия в основном вызваны возможными разными версиями tzdb-data. И вы не можете контролировать, какая версия данных зоны существует на платформе Android, потому что это зависит от пользователя мобильного телефона, как часто он / она обновляет ОС Android . И это также верно для данных ThreetenABP. Вы можете предложить последнюю версию своего приложения, включая последнюю версию ThreetenABP, но вы не можете контролировать, действительно ли пользователь мобильного устройства обновляет приложение.

Другие причины, по которым нужно заботиться о выборе подходящего репозитория tz?

Помимо производительности и времени инициализации, действительно есть один специальный сценарий, который может быть интересен для выбора. Если ОС Android каким-то образом устарела и использует устаревшую версию правил зон, то некоторые пользователи мобильных телефонов не обновляют свою операционную систему, а изменяют часы устройства, чтобы компенсировать неправильные данные часового пояса. Таким образом, они по-прежнему будут показывать точное местное время на мобильном телефоне (во ВСЕХ приложениях).

В этом случае ThreetenABP не предлагает хорошего решения, потому что объединение их правильных данных зоны с неправильными часами устройства приведет к неправильным локальным временным меткам (раздражая пользователя). Это было проблемой, например, в Турции, которая не так давно изменила правила dst.

Использование только старого календаря и API часовых поясов Android (в пакете java.util ) позволяет учесть проблему и создать правильные локальные временные метки. Однако, если приложение передает время в формате UTC (например, как количество миллисекунд с 1970-01-01T00Z) другим хостам (например, серверам), то неправильные часы устройства по-прежнему являются проблемой.

Мы могли бы сказать, зачем беспокоиться, потому что пользователь сделал «ерунду» с конфигурацией устройства, но мы также живем в реальном мире и должны думать о том, как сделать счастливыми даже таких пользователей. Поэтому, думая о решении, я представил, по крайней мере, в моей библиотеке календаря методы Time4A, такие как SystemClock.inPlatformView (), который использует (вероятно) наиболее актуальную зону data и получает правильные часы UTC, исходя из предположения, что пользователь будет, по крайней мере, соблюдать правильное время на локальном устройстве (независимо от того, что он / она сделал для достижения этой цели, либо путем обновления ОС, либо с помощью конфигурации часов / зоны). Я вполне доволен тем, что полностью избегаю старого календаря и API зон. Мой API даже позволяет одновременно использовать оба репозитория зон:

Asia/Jerusalem») // использует данные Android

  • Timezone.of(«Asia/Jerusalem») // использует данные Time4A
  • Возможно, вы сможете извлечь выгоду из этих идей, когда найдете / разработаете подходящие вспомогательные классы для использования ThreetenABP. Time4A имеет открытый исходный код.

    Источник

    Как я могу получить текущую дату и время в UTC или GMT в Java?

    Когда я создаю новый объект Date , он инициализируется текущим временем, но в местном часовом поясе. Как я могу получить текущую дату и время в GMT?

    Читайте также:  Как увеличить скорость мегафон андроид

    Java.util.Date не имеет определенного часового пояса, хотя его значение чаще всего рассматривается по отношению к UTC. Что заставляет вас думать, что это по местному времени?

    Чтобы быть точным: значение в Java.util.Date — это количество миллисекунд с начала эпохи Unix, которая произошла в полночь 1 января 1970 года по UTC. Та же самая Эпоха могла также быть описана в других часовых поясах, но традиционное описание в терминах UTC. Так как это число в миллисекундах с фиксированной эпохи, значение в Java.util.Date одинаково во всем мире в любой конкретный момент, независимо от местного часового пояса.

    Я подозреваю, что проблема в том, что вы отображаете его с помощью экземпляра Calendar, который использует местный часовой пояс, или, возможно, с помощью Date.toString() , который также использует местный часовой пояс, или экземпляра SimpleDateFormat , который по умолчанию также использует местный часовой пояс.

    Если это не проблема, пожалуйста, отправьте пример кода.

    Однако я бы порекомендовал вам использовать Joda-Time в любом случае, который предлагает гораздо более понятный API.

    тЛ; др

    Сгенерируйте строку для представления этого значения:

    Подробности

    Как указано правильный ответ Джон Скит , объект Java.util.Date не имеет часового пояса † , Но его реализация toString применяет часовой пояс JVM по умолчанию при генерации строкового представления этого значения даты и времени. Смущает наивного программиста дата , кажется, имеет часовой пояс, но не имеет.

    Классы Java.util.Date , j.u.Calendar и Java.text.SimpleDateFormat в комплекте с Java общеизвестно проблематичны. Избегайте их. Вместо этого используйте любую из этих компетентных библиотек даты и времени:

    Java.time (Java 8)

    Java 8 предоставляет новый замечательный пакет Java.time. * для замены старых классов Java.util.Date/Calendar.

    Получение текущего времени в формате UTC/GMT — это простой однострочный…

    Этот Instant класс является базовым строительным блоком в Java.time, представляющим момент на временной шкале в UTC с разрешением наносекунды .

    В Java 8 текущий момент фиксируется только с разрешением до миллисекунд. Java 9 содержит новую реализацию of Clock фиксирует текущий момент вплоть до полной наносекундной возможности этого класса, в зависимости от возможностей тактового оборудования вашего хост-компьютера.

    Его метод toString генерирует строковое представление своего значения, используя один конкретный формат ISO 8601 . Этот формат выводит ноль, три, шесть или девять цифр ( миллисекунды , микросекунды или наносекунды ) по мере необходимости для представления дробной части второй.

    Если вы хотите более гибкое форматирование или другие дополнительные функции, тогда примените нулевое смещение от UTC, чтобы сам UTC ( ZoneOffset.UTC константа ) получил OffsetDateTime .

    Дамп на консоль…

    Классы Java.time определяются с помощью JSR 31 . Они были вдохновлены Joda-Time, но полностью перестроены.

    Joda времени

    ОБНОВЛЕНИЕ: Проект Joda-Time , теперь в режим обслуживания , советует перейти на классы Java.time .

    Используя бесплатную библиотеку сторонних разработчиков с открытым исходным кодом Joda-Time , вы можете получить текущую дату и время всего за одну строку кода.

    Joda-Time вдохновил новые классы Java.time. * В Java 8, но имеет другую архитектуру. Вы можете использовать Joda-Time в более старых версиях Java. Joda-Time продолжает работать в Java 8 и продолжает активно поддерживаться (по состоянию на 2014 год). Однако команда Joda-Time советует перейти на Java.time.

    Более подробный пример кода (Joda-Time 2.3)…

    Дамп на консоль…

    Для примера кода, выполняющего работу с часовым поясом, смотрите мой ответ к аналогичному вопросу.

    Часовой пояс

    Я рекомендую всегда указывать часовой пояс, а не полагаться неявно на текущий часовой пояс JVM по умолчанию (который может измениться в любой момент!). Такое доверие, по-видимому, является распространенной причиной путаницы и ошибок в работе с датой и временем.

    При вызове now() передайте желаемый/ожидаемый часовой пояс, который будет назначен. Используйте класс DateTimeZone .

    Этот класс содержит постоянная для UTC часовой пояс.

    Если вы действительно хотите использовать текущий часовой пояс JVM по умолчанию, сделайте явный вызов, чтобы ваш код самодокументировался.

    Источник

    Оцените статью