Как получить часовой пояс android studio

Обновлено: 18.05.2024

Класс Date предназначен для работы с текущими датой и временем и позволяет отталкиваться от них для решения своих задач. При выходе новых версий Java часть методов класса была перемещена в классы Calendar и DateFormat.

При импорте выбирайте java.util.Date, а не java.sql.Date.

У класса есть два конструктора:

Первый конструктор без параметров инициализирует объект текущей датой и временем. Во втором конструкторе вы можете указать количество миллисекунд, прошедших с полуночи 1 января 1970 года.

Если вы посмотрите документацию, то увидите, что существует множество методов для получения или установки отдельных компонентов времени и даты, например, getMinutes()/setMinutes() и др. Все они являются устаревшими и вместо них следует использовать класс Calendar.

Простой пример вывода даты на экран.

С помощью метода getTime() можно отобразить количество миллисекунд, прошедших с 1 января 1970 года. Обновим пример

Calendar

У класса много методов. Вкратце опишем часть из них:

Также в календаре определены много различных констант: AUGUST и другие месяцы, SATURDAY и другие дни недели, HOUR и т.д.

GregorianCalendar

Класс GregorianCalendar является подклассом Calendar, который представляет обычный Григорианский календарь. Метод getInstance() класса Calendar обычно возвращает объект класса GregorianCalendar, инициированный текущей датой и временем согласно региональным настройкам.

Кроме стандартных методов, которые есть в классе Calendar, у GregorianCalendar есть метод isLeapYear() для проверки високосного года.

Если год високосный, то возвращается true.

Отсчёт месяцев идёт от нуля, поэтому декабрь будет одиннадцатым месяцем. Чтобы не путаться с такими случаями, проще использовать понятные константы:

А получать нужные отрезки времени можно через метод get(). Например, узнать, какой месяц содержится в созданной нами дате можно так:

Изменить состояние объекта можно через метод set(). Например, установим новую дату у нашего объекта.

Можно сдвинуть дату на определённый период с помощью метода add(). Отодвинем дату на два месяца.

Методы getTime() и setTime() работают с объектами Date и полезны для преобразования.

TimeZone

Класс TimeZone позволяет работать с часовыми поясами, смещёнными относительно Гринвича, также известного универсальное глобальное время (UTC). Класс также учитывает летнее время.

SimpleTimeZone

Класс DateFormat

Класс DateFormat является абстрактным классом, с помощью которого можно форматировать и анализировать показания даты и времени. метод getDateInstance() возвращает экземпляр класса DateFormat, который может форматировать информацию о дате.

Чаще всего используется метод format(), позволяющий вывести дату в нужном формате.

Класс SimpleDateFormat

Класс SimpleDateFormat является подклассом класса DateFormat и позволяет определять собственные шаблоны форматирования для отображения даты и времени.

Символы форматирования строки

Количество повторений символа определяет способ представления даты. Например, можно указать hh:mm:ss, а можно h:m:s. В первом случае будет отображаться ноль перед цифрой.

Получить текущее время и дату android

В приложении нужно в два отдельных textview вывести дату и время. Я уже перепробовал все что смог найти на просторах интернета, например:

Как узнать текущее время и дату в Android

Как узнать текущее время и дату в приложении для Android?

Вы можете использовать:

В календаре достаточно констант для всего, что вам нужно.

Из ссылки, указанной выше:

ПРИМЕЧАНИЕ 1. Прошло несколько лет с тех пор, как я написал этот ответ, и речь идет о старом, специфичном для Android, и теперь устаревшем классе. Google теперь говорит, что «[t] его класс имеет ряд проблем, и рекомендуется использовать GregorianCalendar вместо этого».

ПРИМЕЧАНИЕ 2. Несмотря на то, что у Time класса есть toMillis(ignoreDaylightSavings) метод, это просто удобство для перехода к методам, которые ожидают время в миллисекундах. Значение времени с точностью до одной секунды ; доля в миллисекундах всегда 000 . Если в цикле вы делаете

Результирующая последовательность будет повторять одно и то же значение, например 1410543204000 , до тех пор, пока 1410543205000 не начнется следующая секунда, после чего начнется повторение.

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

Дата :

Время:

Для тех, кто предпочитает индивидуальный формат, вы можете использовать:

Принимая во внимание, что вы можете иметь шаблоны DateFormat, такие как:

На самом деле, безопаснее установить текущий часовой пояс, установленный на устройстве, с помощью Time.getCurrentTimezone() , иначе вы получите текущее время в UTC.

Затем вы можете получить все нужные поля даты, например:

ОБНОВИТЬ

Как отмечают многие, Google говорит, что у этого класса есть ряд проблем, и его больше нельзя использовать:

Этот класс имеет ряд проблем, поэтому рекомендуется использовать GregorianCalendar.

Известные вопросы:

По историческим причинам при выполнении временных вычислений вся арифметика в настоящее время выполняется с использованием 32-разрядных целых чисел. Это ограничивает достоверный диапазон времени, представляемый с 1902 до 2037 года. Подробности смотрите в статье в Википедии о проблеме 2038 года. Не полагайтесь на это поведение; это может измениться в будущем. Вызов switchTimezone (String) в дату, которая не может существовать, например, в настенное время, которое было пропущено из-за перехода на летнее время, приведет к дате в 1969 году (т.е. -1 или 1 секунда до 1 января 1970 года по Гринвичу). Большая часть форматирования / синтаксического анализа предполагает использование текста ASCII и поэтому не подходит для использования со сценариями, не относящимися к ASCII.

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

Я получаю часовой пояс в формате "GMT-7", т. е. строку. и у меня есть системное время.

есть ли чистый способ получить текущее время в указанном выше часовом поясе? Любая помощь приветствуется. Спасибо,

изменить : Пытаясь сделать это:

Я заставил его работать так:

как старые классы даты-времени в комплекте с Java, так и сторонняя библиотека Joda-Time были заменены java.время фреймворк, встроенный в Java 8 и более поздние версии. Эти классы вытесняют старые хлопотные классы даты-времени, такие как java.util.Date . См.В Oracle Учебник. Большая часть java.функциональность времени обратно портирована на Java 6 & 7 в ThreeTen-Backport и далее адаптированы к Android в ThreeTenABP.

кстати, никогда не ссылайтесь на смещение от-UTC С одной цифрой часов, таких как -7 , поскольку это нестандартно и будет несовместимо с различными протоколами и библиотеками. Всегда pad с нулем для второй цифры, например -07 .

если у вас есть смещение, а не часовой пояс, используйте OffsetDateTime класса.

если у вас есть полный часовой пояс, который является смещением плюс набор правил для обработки аномалий, таких как летнее время (DST), а не просто смещение от-UTC, используйте ZonedDateTime класса.

текущее время в Америка/Денвер: 20:41:36.560

вы можете использовать Joda Времени 2.7 в Android. Делает работу даты-времени гораздо легче.

я настоятельно рекомендую против отслеживание по времени по счету-с-эпохи. Но при необходимости вы можете извлечь Joda-Time внутренние миллисекунды-с-эпохи (Unix время, первый момент 1970 UTC), вызвав getMillis метод DateTime .

обратите внимание на использование 64-разрядного long , а не 32-бит int примитивные типы.

на java.время. Имейте в виду, что вы можете потерять данные, как Java.время держит разрешение до наносекунд. Переход от наносекунд к миллисекундам означает усечение до шести цифр десятичной доли секунды (3 цифры для миллисекунд, 9 для наносекунд).

Класс Date предназначен для работы с текущими датой и временем и позволяет отталкиваться от них для решения своих задач. При выходе новых версий Java часть методов класса была перемещена в классы Calendar и DateFormat.

При импорте выбирайте java.util.Date, а не java.sql.Date.

У класса есть два конструктора:

Первый конструктор без параметров инициализирует объект текущей датой и временем. Во втором конструкторе вы можете указать количество миллисекунд, прошедших с полуночи 1 января 1970 года.

  • boolean after(Date date) - если объект класса Date содержит более позднюю дату, чем указано в параметре, то возвращается true
  • boolean before(Date date) - если объект класса Date содержит более раннюю дату, чем указано в параметре, то возвращается true
  • int compareTo(Date date) - сравнивает даты. Возвращает 0, если совпадают, отрицательное значение - если вызывающая дата более ранняя, положительное значение - если вызывающая дата более поздняя, чем в параметре
  • boolean equals(Object object) - если даты совпадают, то возвращается true
  • long getTime() - возвращает количество миллисекунд, прошедших с полуночи 1 января 1970 года
  • void setTime(long milliseconds) - устанавливает время и дату в виде числа миллисекунд, прошедших с полночи 1 января 1970 года.

Если вы посмотрите документацию, то увидите, что существует множество методов для получения или установки отдельных компонентов времени и даты, например, getMinutes()/setMinutes() и др. Все они являются устаревшими и вместо них следует использовать класс Calendar.

Простой пример вывода даты на экран.

С помощью метода getTime() можно отобразить количество миллисекунд, прошедших с 1 января 1970 года. Обновим пример

Calendar

Абстрактный класс Calendar позволяет преобразовать время в миллисекундах в более удобном виде - год, месяц, день, часы, минуты, секунды. Существуют также подклассы, например, GregorianCalendar.

Переменная типа boolean под именем areFieldsSet указывает, были установлены компоненты времени. Переменная fields - это массив целочисленных значений, содержащий компоненты времени. Переменная isSet - массив типа boolean, указывающий, был ли установлен специфический компонент времени. Переменная time (тип long) содержит текущее время объекта. Переменная isTimeSet (тип boolean) указывает, что было установлено текущее время.

У класса много методов. Вкратце опишем часть из них:

  • abstract void add(int field, int value) - добавляет value к компоненту времени или даты, указанному в параметре field (например, Calendar.HOUR). Чтобы отнять, используйте отрицательное значение.
  • boolean after(Object calendar) - возвращает значение true, если вызывающий объект класса Calendar содержит более позднюю дату, чем calendar.
  • boolean before(Object calendar) - возвращает значение true, если вызывающий объект класса Calendar содержит более раннюю дату, чем calendar.
  • final void clear() - обнуляет все компоненты времени в вызывающем объекте.
  • final void clear(int field) - обнуляет компонент, указанный в параметре field
  • int get(int field) - возвращает значение одного компонента, например, Calendar.MINUTE
  • synchronized static Locale[] getAvailableLocales() - возвращает массив объектов класса Locale, содержащий региональные данные
  • synchronized static Calendar getInstance() - возвращает объект класса Calendar для региональных данных и часового пояса по умолчанию. Есть и другие перегруженные версии.
  • final Date getTime() - возвращает объекта класса Date, содержащий время, эквивалентное вызывающему объекту
  • TimeZone getTimeZone() - возвращает часовой пояс
  • final boolean isSet(int field) - возвращает значение true, если указанный компонент времени указан.
  • void set(int field, int value) - устанавливает компоненты даты или времени. Есть перегруженные версии
  • final void setTime(Date date) - устанавливает различные компоненты даты и времени через объект класса Date
  • void setTimeZone(TimeZone timezone) - устанавливает часовой пояс через объект класса TimeZone

Также в календаре определены много различных констант: AUGUST и другие месяцы, SATURDAY и другие дни недели, HOUR и т.д.

GregorianCalendar

Класс GregorianCalendar является подклассом Calendar, который представляет обычный Григорианский календарь. Метод getInstance() класса Calendar обычно возвращает объект класса GregorianCalendar, инициированный текущей датой и временем согласно региональным настройкам.

У класса есть два поля AD и BC - до нашей эры и наша эра.

Кроме стандартных методов, которые есть в классе Calendar, у GregorianCalendar есть метод isLeapYear() для проверки високосного года.

Если год високосный, то возвращается true.

Отсчёт месяцев идёт от нуля, поэтому декабрь будет одиннадцатым месяцем. Чтобы не путаться с такими случаями, проще использовать понятные константы:

А получать нужные отрезки времени можно через метод get(). Например, узнать, какой месяц содержится в созданной нами дате можно так:

Изменить состояние объекта можно через метод set(). Например, установим новую дату у нашего объекта.

Можно сдвинуть дату на определённый период с помощью метода add(). Отодвинем дату на два месяца.

Методы getTime() и setTime() работают с объектами Date и полезны для преобразования.

TimeZone

Класс TimeZone позволяет работать с часовыми поясами, смещёнными относительно Гринвича, также известного универсальное глобальное время (UTC). Класс также учитывает летнее время.

SimpleTimeZone

Класс SimpleTimeZone - подкласс класса TimeZone и позволяет работать с часовыми поясами в Григорианском календаре.

Класс DateFormat

Класс DateFormat является абстрактным классом, с помощью которого можно форматировать и анализировать показания даты и времени. метод getDateInstance() возвращает экземпляр класса DateFormat, который может форматировать информацию о дате.

Чаще всего используется метод format(), позволяющий вывести дату в нужном формате.

Класс SimpleDateFormat

Класс SimpleDateFormat является подклассом класса DateFormat и позволяет определять собственные шаблоны форматирования для отображения даты и времени.

Символы форматирования строки

  • A - AM или PM
  • d - день месяца (1-31)
  • D - день в году (1-366)
  • H - часы в формате AM/PM (1-12)
  • K - часы в формате суток (1-24)
  • M - минуты (0-59)
  • S - секунды (0-59)
  • W - неделя в году (1-53)
  • y - год
  • z - часовой пояс

Количество повторений символа определяет способ представления даты. Например, можно указать hh:mm:ss, а можно h:m:s. В первом случае будет отображаться ноль перед цифрой.

Как узнать текущее время и дату в приложении для Android?

43 ответа! Хотя многие из них были хорошими, когда они были написаны, хороший ответ для использования в 2018 году здесь .

Вы можете использовать:

В календаре достаточно констант для всего, что вам нужно.

+1 Это было очень полезно. Будучи новичком, это все эти маленькие лакомые кусочки, которые нам нужны . Я использую Календарь, чтобы получить юлианскую дату. Намного проще, чем получить миллисекунды и выяснить, равняется ли значение сегодня;) Но откуда это тянуть дату и время? само устройство андроид настраивается? @Kyle Да, это основано на настройках времени устройства / часового пояса. Цитата из документа : «Метод getInstance Календаря возвращает календарь, локаль которого основана на системных настройках и поля времени которого были инициализированы с текущей датой и временем» - (над первой строкой кода образца в документации класса). +1 это решение с точностью до миллисекунды, как раз то, что мне нужно. Как говорит @adamdport, это на самом деле не отвечает на вопрос . Calendar.getInstance().getTime() или Calendar.getInstance().getTimeInMillis() сработает.

Вы можете ( но больше не должны - смотрите ниже!) Использовать android.text.format.Time :

Из ссылки, указанной выше:

Класс Time - более быстрая замена для классов java.util.Calendar и java.util.GregorianCalendar. Экземпляр класса Time представляет момент времени, указанный с точностью до секунды.

ПРИМЕЧАНИЕ 1. Прошло несколько лет с тех пор, как я написал этот ответ, и речь идет о старом, специфичном для Android, и теперь устаревшем классе. Google теперь говорит, что «[t] его класс имеет ряд проблем, и рекомендуется использовать GregorianCalendar вместо этого».

ПРИМЕЧАНИЕ 2. Несмотря на то, что у Time класса есть toMillis(ignoreDaylightSavings) метод, это просто удобство для перехода к методам, которые ожидают время в миллисекундах. Значение времени с точностью до одной секунды ; доля в миллисекундах всегда 000 . Если в цикле вы делаете

Результирующая последовательность будет повторять одно и то же значение, например 1410543204000 , до тех пор, пока 1410543205000 не начнется следующая секунда, после чего начнется повторение.

@InsanityOnABun и Мухаммед Бабар. Нет нет нет. Документы говорят «указано со второй точностью». Даже самый простой тест (получение текущего времени в цикле, toMillis и запись / печать результата) показал бы, что полученное время имеет значение 000 в миллисекундах! @IgorZelaya Если вам нужна точность в миллисекундах, вы, скорее всего, используете интервал времени , а не время суток. Документы Android рекомендуют SystemClock.uptimeMillis() для интервального времени. Так как это то, что используется большинством встроенных функций, есть сильная мотивация для того, чтобы это было хорошо реализовано на всех устройствах. Смотрите обсуждение в SystemClock . Если вы хотите соотнести это с временем суток, в onResume приложения прочитайте и это, и Time / setToNow / toMillis. Помните разницу между этими. Не используйте класс Time . Он будет удален в будущем, и у него будет много проблем. > Этот класс устарел на уровне API 22. Вместо этого используйте GregorianCalendar. Смотрите здесь На самом деле, он GregorianCalendar был вытеснен несколько лет назад в Java, а затем и в Android классами java.time , в частности ZonedDateTime . Для более ранних версий Android см. Проекты ThreeTen- Backport и ThreeTenABP .

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

Дата :

Время:

Это даст время в UTC, должно адаптироваться к часовым поясам. Осторожно, SimpleDateFormat может быть проблематичным, если производительность является проблемой. В моем приложении было пользовательское представление, в котором было около 20 меток ЧЧ: ММ, представляющих определенное время (длинные целые числа, содержащие миллисекунды), и такое же количество доступных для рисования ресурсов. Первоначальное тестирование показало, что взаимодействие не было таким подвижным, как я хотел. Когда я профилировал onDraw (), я обнаружил, что вызовы SimpleTimeFormatter занимают 80% времени. Фактически, я читаю эту страницу как часть поиска более эффективного средства форматирования, чтобы узнать больше о календарях и т. Д. Да, но не больше. Я не осознавал сопутствующих накладных расходов и предполагал, что это в значительной степени POJO. Короче говоря: String currentDateandTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); Вы можете вставить sdf.setTimeZone(TimeZone.getDefault()) в середине

Для тех, кто предпочитает индивидуальный формат, вы можете использовать:

Принимая во внимание, что вы можете иметь шаблоны DateFormat, такие как:

На самом деле, безопаснее установить текущий часовой пояс, установленный на устройстве, с помощью Time.getCurrentTimezone() , иначе вы получите текущее время в UTC.

Затем вы можете получить все нужные поля даты, например:

ОБНОВИТЬ

Как отмечают многие, Google говорит, что у этого класса есть ряд проблем, и его больше нельзя использовать:

Этот класс имеет ряд проблем, поэтому рекомендуется использовать GregorianCalendar.

Известные вопросы:

По историческим причинам при выполнении временных вычислений вся арифметика в настоящее время выполняется с использованием 32-разрядных целых чисел. Это ограничивает достоверный диапазон времени, представляемый с 1902 до 2037 года. Подробности смотрите в статье в Википедии о проблеме 2038 года. Не полагайтесь на это поведение; это может измениться в будущем. Вызов switchTimezone (String) в дату, которая не может существовать, например, в настенное время, которое было пропущено из-за перехода на летнее время, приведет к дате в 1969 году (т.е. -1 или 1 секунда до 1 января 1970 года по Гринвичу). Большая часть форматирования / синтаксического анализа предполагает использование текста ASCII и поэтому не подходит для использования со сценариями, не относящимися к ASCII.


Предположим, вы уже давно используете Android, а потому может показаться, что он прекрасно справляется с задачами синхронизации времени – будильники срабатывают вовремя, каких-то явных отклонений времени не наблюдается и т. д. Однако уверены ли вы полностью в том, откуда Android на самом деле получает данные о точном времени и часовых поясах? Если у вас есть хоть какие-то сомнения о том, как это работает — добро пожаловать под кат.


В Android существует две проблемы со временем: это его непредсказуемая синхронизация и необходимость в актуализации данных о часовых поясах даже в самой свежей версии ОС.

Предыстория: Android является мобильной ОС, базирующейся на ядре Linux, он спокойно подключается к интернету и, конечно же, можно предположить, что синхронизация времени осуществляется с помощью NTP, однако, это не так. Исторически сложилось, что Android был предназначен для использования исключительно в мобильных телефонах (вспомните версию 1.6). При этом только к 3 мажорной версии он обзавёлся интерфейсом для планшетов и начали́сь другие подвижки к унификации интерфейса и начинки ОС. Однако даже версии 4.4 и Android L получают сигналы точного времени теми же методами, что их получала Nokia 3310 и другие, более ранние GSM/3GPP телефоны, т. е. от вышек сотовой связи при регистрации в сети (при подключении к вышке). При этом планшеты или другие устройства без модуля связи, в принципе не имеют возможности синхронизировать время автоматически.

К великому сожалению, чтобы научить Android синхронизировать время полностью автоматически с помощью NTP нам понадобиться root доступ ибо API для точной установки времени в Android ныне отсутствует.

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

Скриншот окна настроек «Настройки -> Дата и время» версии Android 4.x:


Далее, необходимо установить приложение ClockSync, которое и будет выступать для нас альтернативой демону синхронизации времени с помощью NTP.

Скриншоты окна программы ClockSync до синхронизации (слева) и после (справа):



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

Убедившись, что всё работает, настроим автоматическую синхронизацию в программе ClockSync. Для повышения точности я рекомендую включить опции «Режим высокой точности» и «Только через WI-FI». Если с первой опцией всё понятно из описания в программе (см. скриншот ниже), то вторую опцию я рекомендую включить в первую очередь не из соображений экономии мобильного трафика, а из-за того, что мобильный интернет не способен гарантировать хоть сколько-нибудь стабильные задержки.

Всё ещё распространённый мобильный интернет 2-го (GPRS/EDGE) в принципе не в состоянии обеспечить стабильные задержки при передаче. Даже интернет 3-го (3G) и, в некоторой мере, 4-го (LTE/LTE-advanced) поколений при сильной загрузке сети или каналов связи между БС, что является типичной ситуацией для крупных населённых пунктов, не может гарантировать стабильные задержки. Поэтому даже с аппроксимацией конечная точность установки времени может быть хуже долей секунд и даже легко достигать нескольких секунд.

Помимо этого я рекомендую включить опцию «При включении», чтобы лишний раз не выводить устройство из глубокого сна и тем самым сэкономить энергию.

Скриншот настроек автоматической синхронизации в ClockSync:


В связи с масштабными изменениями часовых поясов в РФ осенью этого года необходимо уже сейчас задуматься об актуализации информации о них на всех устройствах и если с поддерживаемыми настольными ОС проблем не возникает, то в Android даже самая свежая версия ОС содержит устаревшие данные. Для того чтобы в этом убедиться устанавливаем TimeZone Fixer и наблюдаем неприглядную картину.

Скриншот программы TimeZone Fixer, запущенной на Android 4.4.4 (прошивка Cyanogenmod от 4 августа 2014), на котором хорошо видно, что данные в прошивке неактуальные:


Немножечко здравого беспокойства и заботы о пользователях:

Автор программы TimeZone Fixer предупреждает нас, что обновление файлов данных о часовых поясах может полностью «сломать» устройство и даже даёт рекомендации о том как обезопасить себя от дополнительных проблем, хоть случаи проблем единичные и очень специфичные — это действительно хорошая забота о простых пользователях.



Только поэтому я и внёс этот кусочек в статью, он хоть и не имеет непосредственного отношения к проблеме, но это действительно хороший пример заботы о пользователях. В то же время предупреждение насчёт версий 4.3+ вызвано лишь малым количеством отзывов о программе для устройств с новыми версиями ОС, поэтому, пожалуйста, после использования обязательно напишите о́тзыв об этом приложении.

После обновления данных о часовых поясах программа предло́жит перезагрузится, однако, я рекомендую перезагрузить устройство самостоятельно через системное меню поскольку программа осуществляет перезагрузку фактически эквивалентную reset, что, пусть и с малой вероятностью, но может привести к проблемам и потери данных.

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

UPD: Эта инструкция полностью решает проблему часовых поясов только для версий младше 4.4. С версии 4.4 нужен дополнительный патчинг, пока вопрос находится на стадии исследования возможностей для создания юзер-френдли решения.

Читайте также: