- Классы Date, Calendar, DateFormat
- Calendar
- GregorianCalendar
- TimeZone
- SimpleTimeZone
- Класс DateFormat
- Класс SimpleDateFormat
- Диалоговые окна
- DatePickerDialog и TimePickerDialog
- Получить текущее время и дату на Android
- ТЛ; др
- Детали
- java.time
- Instant
- Часовой пояс
- Создание строк
- ISO 8601
- Пользовательский формат
- Локализации
- О java.time
Классы Date, Calendar, DateFormat
Класс 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. В первом случае будет отображаться ноль перед цифрой.
Примеры работы с датами и временем можно найти в статье на эту тему.
Источник
Диалоговые окна
DatePickerDialog и TimePickerDialog
По умолчанию в Android уже определены два диалоговых окна — DatePickerDialog и TimePickerDialog , которые позволяют выбрать дату и время.
Кроме установки даты DatePickerDialog позволяет обработать выбор даты с помощью слушателей OnDateChangedListener и OnDateSetListener . Что позволяет использовать выбранную дату далее в приложении.
Подобным образом TimePickerDialog позволяет обработать выбор времени с помощью слушателей OnTimeChangedListener и OnTimeSetListener
Пи работе с данными компонентами надо учитывать, что отсчет месяцев в DatePickerDialog начинается с нуля, то есть январь будет иметь номер 0, а декабрь — 11. И аналогично в TimePickerDialog отсчет секунд и минут будет идти с 0 до 59, а часов — с 0 до 23.
Используем DatePickerDialog и TimePickerDialog в приложении. Определим следующую разметку интерфейса в activity_main.xml :
Здесь определены две кнопки для выбора даты и времени и текстовое поле, отображающее выбранные дату и время. И изменим код MainActivity :
Ключевым классом здесь является java.util.Calendar , который хранится в стандартной библиоетке классов Java. В методе setInitialDateTime() мы получаем из экземпляра этого класса количество миллисекунд dateAndTime.getTimeInMillis() и с помощью форматирования выводим на текстовое поле.
Метод setDate() , вызываемый по нажатию на кнопку, отображает окно для выбора даты. При создании окна его объекту передается обработчик выбора даты DatePickerDialog.OnDateSetListener , который изменяет дату на текстовом поле.
Аналогично метод setTime() отображает окно для выбора времени. Объект окна использует обработчик выбора времени TimePickerDialog.OnTimeSetListener , который изменяет время на текстовом поле.
И поле запуска, нажав на кнопку изменения времени, мы сможем установить время:
Источник
Получить текущее время и дату на Android
Как получить текущее время и дату в приложении для Android?
Вы можете использовать:
В календаре есть много констант для всего, что вам нужно. Редактирование: документация по календарю
Вы можете ( но больше не нужно – см. Ниже!) Использовать android.text.format.Time :
Из ссылки, приведенной выше:
Класс Time – это более быстрая замена классов java.util.Calendar и java.util.GregorianCalendar. Экземпляр класса Time представляет собой момент времени, указанный со второй точностью.
ПРИМЕЧАНИЕ 1. Прошло несколько лет с тех пор, как я написал этот ответ, и речь идет о старом, специфичном для Android и теперь устаревшем классе. Google теперь говорит, что «[t] его класс имеет ряд проблем, и рекомендуется использовать GregorianCalendar ».
ПРИМЕЧАНИЕ 2. Хотя класс Time имеет toMillis(ignoreDaylightSavings) , это просто удобство перехода к методам, которые ожидают время в миллисекундах. Значение времени только точная до одной секунды ; Часть миллисекунд всегда равна 000 . Если в цикле вы делаете
Полученная последовательность повторит то же значение, например 1410543204000 , до следующей следующей секунды, и в это время 1410543205000 начнет повторяться.
Если вы хотите получить дату и время в определенном шаблоне, вы можете использовать следующее:
Для тех, кто предпочитает настраиваемый формат, вы можете использовать:
В то время как вы можете иметь шаблоны DateFormat, такие как:
На самом деле безопаснее устанавливать текущий часовой пояс на устройстве с помощью Time.getCurrentTimezone() , иначе вы получите текущее время в UTC.
Затем вы можете получить все поля даты, которые вы хотите, например:
См. Раздел android.text.format.Time для всех деталей.
ОБНОВИТЬ
Как многие люди указывают, Google говорит, что этот класс имеет ряд проблем и больше не должен использоваться:
У этого класса есть ряд проблем, поэтому рекомендуется использовать GregorianCalendar.
По историческим причинам при выполнении вычислений времени вся арифметика в настоящее время выполняется с использованием 32-битных целых чисел. Это ограничивает надежный временной диапазон, представляемый с 1902 года по 2037 год. Подробнее см. Статью в википедии о проблеме 2038 года. Не полагайтесь на это поведение; Он может измениться в будущем. Вызов switchTimezone (String) на дату, которая не может существовать, например, время стены, которое было пропущено из-за перехода на летнее время, приведет к дате в 1969 году (т.е. -1 или 1 секунде до 1 января 1970 UTC). Большая часть форматирования / синтаксического анализа предполагает текст ASCII и поэтому не подходит для использования с не-ASCII-скриптами.
Для текущей даты и времени используйте:
Чтобы указать текущее время, вы можете использовать System.currentTimeMillis() который является стандартным для Java. Затем вы можете использовать его для создания даты
И как упоминалось другими, чтобы создать время
Попробуйте таким образом. Все форматы приведены ниже, чтобы получить формат даты и времени.
Вы можете использовать код:
Здесь вы также можете получить дополнительные параметры форматирования для SimpleDateFormat .
Легко, вы можете проанализировать время, чтобы получить отдельные значения для текущего времени, а именно:
То же самое касается даты:
Существует несколько вариантов, поскольку Android – это в основном Java, но если вы хотите записать его в текстовом виде, следующий код будет делать трюк:
ТЛ; др
Детали
Остальные ответы, правда, устарели. Старые классы времени-времени оказались плохо спроектированными, запутанными и сложными.
java.time
Эти старые классы были заменены рамкой java.time .
- Java 8 и более поздние версии: фреймворк java.time встроен.
- Java 7 и 6: используйте обратный путь java.time .
- Android: используйте эту завернутую версию этого backport .
Эти новые классы вдохновлены очень успешным проектом Joda-Time , определенным JSR 310 , и расширенным проектом ThreeTen-Extra .
См. Учебник Oracle .
Instant
Instant – это момент на временной шкале в формате UTC с разрешением до наносекунд .
Часовой пояс
Примените часовой пояс ( ZoneId ), чтобы получить ZonedDateTime . Если вы опустите часовой пояс, ваш часовой пояс вашего JVM неявно применяется. Лучше указать явно желаемый / ожидаемый часовой пояс.
Используйте правильные названия часовых поясов в формате continent/region такие как America/Montreal , Europe/Brussels или Asia/Kolkata . Никогда не используйте аббревиатуры 3-4 букв, такие как EST или IST поскольку они не являются стандартизованными и не уникальными.
Создание строк
Вы можете легко создать String в качестве текстового представления значения даты и времени. Вы можете использовать стандартный формат, свой собственный формат или автоматически локализованный формат.
ISO 8601
Вы можете вызвать методы toString для форматирования текста с использованием общего и разумного стандарта ISO 8601 .
Обратите внимание, что для ZonedDateTime метод toString расширяет стандарт ISO 8601, добавляя имя часового пояса в квадратных скобках. Очень полезная и важная информация, но не стандартная.
2016-03-22T20: 09: 01.613-08: 00 [Америка / Los_Angeles]
Пользовательский формат
Или укажите свой собственный шаблон форматирования с классом DateTimeFormatter .
Укажите язык для человеческого языка (английский, французский и т. Д.), Чтобы использовать при переводе названия дня / месяца, а также в определении культурных норм, таких как порядок года и месяца и даты. Обратите внимание, что Locale имеет никакого отношения к часовому поясу.
Локализации
Еще лучше, пусть java.time выполняет работу по локализации автоматически.
О java.time
Рамка java.time встроена в Java 8 и более поздних версий . Эти классы вытесняют неприятные старые устаревшие классы времени, такие как java.util.Date , java.text.SimpleDateFormat и java.text.SimpleDateFormat .
Проект Joda-Time , теперь в режиме обслуживания , советует перейти на java.time.
Дополнительную информацию можно найти в учебнике Oracle . И поиск Stack Overflow для многих примеров и объяснений. Спецификация – JSR 310 .
Где получить классы java.time?
- Java SE 8 и SE 9 и более поздние версии
- Встроенный.
- Часть стандартного Java API с интегрированной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и SE 7
- Большая часть функциональных возможностей java.time портирована на Java 6 и 7 в ThreeTen-Backport .
- Android
- Проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше) специально для Android.
- См. Как использовать ….
Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval , YearWeek , YearQuarter и т . Д.
Форматы формата даты
Вы также можете использовать android.os.SystemClock. Например, SystemClock.elapsedRealtime () даст вам более точные показания времени, когда телефон спит.
Это даст вам, например, 12:32.
Не забудьте импортировать android.text.format.Time;
Вы можете получить дату, используя:
Это даст вам результат в хорошей форме, как в этом примере: «2014/02/09».
Для настроенного формата времени и даты:
Результат выглядит как ниже: 2015-06-18T10: 15: 56-05: 00
Попробуйте это для меня тоже.
Это метод, который будет полезен для получения даты и времени:
Вы можете вызвать этот метод и получить текущие значения даты и времени:
Вы можете просто использовать следующий код:
Вы должны использовать класс Calender в соответствии с новым API. Класс Date теперь устарел.
Попробуйте этот код, на котором отображаются текущие дата и время
Если вам нужна текущая дата,
Если вам нужно текущее время,
Попробуйте использовать ниже код:
Чтобы получить короткую форматированную по дате строку String в локализованном формате устройства.
Я не могу понять, почему так много ответов являются жестко заданными форматами даты и времени, когда OS / Java поставляет правильную локализацию Дат и времени? Разве лучше не использовать форматы устройства, а не программиста?
Он также обеспечивает чтение дат в локализованных форматах:
Тогда это зависит от пользователя, задающего формат, который показывает даты и время, а не вы? Независимо от языков и т. Д. В разных странах с разными языками существуют разные форматы.
В пакете com.google.gson.internal.bind.util есть класс ISO8601Utils utils, поэтому, если вы используете GSON в своем приложении, вы можете использовать его.
Он поддерживает миллисы и часовые пояса, поэтому это довольно хороший вариант прямо из коробки.
Источник