Android studio форматирование даты

Классы 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. В первом случае будет отображаться ноль перед цифрой.

Примеры работы с датами и временем можно найти в статье на эту тему.

Источник

Zheka’s blog

Monday, July 1, 2013

Форматирование даты/времени в Android приложении

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

Первая мысль, которая приходит в голову — это использование java.text.DateFormat (и как частный случай SimpleDateFormat ):

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

Более правильный решение — это использовать android.text.format.DateFormat . Класс имеет ряд методов, возвращающих шаблон представления даты/времени в соответствии с системной локалью: getDateFormat() , getTimeFormat() и т.д.

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

Мы подошли вплотную к правильному решению — DateUtils . Класс предоставляет семейство методов formatDateTime() и formatDateRange , принимающие флаги в качестве параметров, указывающие, какие поля нужно включить в шаблон. Преимущество в том, что форматирование осуществляется автоматически с учетом локали пользователя, избавляя нас от обработки всех тонкостей вручную:

DateUtils.formatDateRange() необходим для форматирования временного диапазона(например, «Jan 5 — Feb 12» ). Может возникнуть логичный вопрос. Для чего это нужно, если можно выполнить конкатенацию двух дат с использованием formatDateTime() ? Помимо того что он проще, в опр. условиях будет выполнена оптимизация представления даты за счет уменьшения количества отображаемых полей(например, если год/месяц не меняется в рамках диапазона):

Единственная вещь в formatDateRange() на которую следует обратить внимание — округления даты. Возможно вы заметили в примере выше, что верхняя граница диапазона была округлена в меньшую сторону(до 24 декабря вместо 25-го). Это произошло из-за того, что было выполнено отсечение по суточной границе(оригинальный текст — that’s because it cuts off at midnight). Если добавить миллисекунды, то диапазон будет представлен верно.

Чтобы ваше приложение правильно представляло дату/время и по прежнему имело возможность контролировать формат DateUtils — хорошая отправная точка. Зная и умело используя флаги, можно добиться определенной гибкости.

Читайте также:  Музыкальный редактор андроид 4pda

Источник

Как отформатировать дату и время в Android?

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

Используйте стандартный класс Java DateFormat.

Например, для отображения текущей даты и времени сделайте следующее:

Вы можете инициализировать объект Date своими собственными значениями, однако вы должны знать, что конструкторы устарели, и вам действительно следует использовать объект Java Calendar.

На мой взгляд, android.text.format.DateFormat.getDateFormat(context) меня смущает, потому что этот метод возвращает, java.text.DateFormat а не android.text.format.DateFormat — — «.

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

Кроме того, вы можете использовать другие форматы. Следуйте DateFormat .

Вы можете использовать DateFormat . Результат зависит от локали телефона по умолчанию, но вы также можете указать локаль:

Это результаты на

FR Locale: 3 ноября. 2017

США / En Locale: 12 января 1952 г.

FR Locale: 03/11/2017

США / En Locale: 12.13.52

FR Locale: 3 ноября. 2017

США / En Locale: 12 января 1952 г.

FR Locale: 3 ноября 2017

США / En Locale: 12 января 1952 г.

FR Местонахождение: 3 ноября 2017

США / En Locale: вторник, 12 апреля 1952 г.

FR Locale: 3 ноября. 2017 16:04:58

FR Locale: 11.03.2017 16:04

FR Locale: 11.03.2017 16:04:58

FR Местонахождение: 11.03.2017 16:04:58 GMT + 01: 00

FR Местонахождение: 11.03.2017 16:04:58 heure normale d’Europe centrale

FR Locale: 16:04:58

FR Locale: 16:04:58

FR Язык: 16:04:58 GMT + 01: 00

FR Locale: 16:04:58 heure normale d’Europe centrale

Строка даты для локали:

-> 31 декабря 1969 г.

-> 31 декабря 1969 г. 16:00:00

Это сделает это:

Используйте SimpleDateFormat

Лучше всего использовать Android родной класс Time:

Используйте эти две переменные класса:

И используйте это так:

Это мой метод, вы можете определить и формат ввода и вывода.

SimpleDateFormat

Я использую SimpleDateFormat без пользовательского шаблона для получения фактической даты и времени из системы в предварительно выбранном формате устройства:

возвращает :

Используйте сборку в классе Time!

Другие ответы, как правило, правильные. Я хотел бы внести современный ответ. Классы Date , DateFormat и SimpleDateFormat используются в большинстве других ответов, давно устарел и вызвали проблемы для многих программистов на протяжении многих лет. Сегодня у нас намного лучше java.time , AKA JSR-310, современный Java date & time API. Можете ли вы использовать это на Android еще? Несомненно! Современные классы были перенесены на Android в проекте ThreeTenABP. Смотрите этот вопрос: Как использовать ThreeTenABP в Android Project для всех деталей.

Этот фрагмент должен помочь вам начать:

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

Когда вместо этого я устанавливаю на датский, я получаю:

Так что следуйте конфигурации. Однако я не уверен, насколько точно он соответствует настройкам даты и времени вашего устройства, и это может варьироваться от телефона к телефону.

Источник

Форматирование чисел в Android-приложении: уроки программирования

Проблема

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

Решение

Используйте функцию String.format() или один из подклассов класса NumberFormat .

Обсуждение

Функция printf() была впервые включена в язык программирования С в 1970- х гг. и использовалась на многих других языках, включая Java. Вот простой пример printf() в версии Java SE:

В предыдущем примере можно было бы напечатать что-то вроде этого:

Поскольку мы не используем System.out на платформе Android, вам будет приятно заметить, что вы можете получить ту же строку, которая будет напечатана, для того, чтобы поместить ее в представление, используя:

Если раньше вы не видели функцию printf() , то первым аргументом, очевидно, является строка кода формата, а любые другие аргументы (имя пользователя и время) являются значениями, которые нужно форматировать. Коды формата начинаются со знака процента ( % ) и имеют хотя бы один код для элементарных типов.

В табл. 1 приведены некоторые коды для элементарных типов.

Таблица 1. Некоторые коды для форматирования элементарных типов

Читайте также:  Очиститель для планшета андроид

Символ

Значение

Строка (конвертировать элементарные значения с использованием значений по умолчанию, конвертировать объекты с помощью функции toString )

Десятичное целое число (int, long)

Число с плавающей точкой (float, double)

Форматы времени/даты, специфичные для Java; См. в конце статьи

Форматирование даты по умолчанию довольно уродливое, поэтому нам часто нужно расширять его. Возможности форматирования printf() на самом деле размещены в классе java.util.Formatter , на который должна быть сделана ссылка.

В отличие от функции printf() на других языках, которые вы, возможно, использовали, все эти форматные процедуры необязательно позволяют ссылаться на аргументы по их числу, помещая число плюс знак доллара после ввода знака % , но до собственно кода форматирования. Например, %2$3.1f означает форматирование второго аргумента как десятичного числа с тремя символами и одной цифрой после десятичной точки. Эта нумерация может использоваться для двух целей: изменить порядок, в котором выводятся аргументы (часто полезны с интернационализацией), и ссылаться на данный аргумент более одного раза. Формат даты/времени t требует после него второго символа, такого как Y для года, m для месяца и т. д. Здесь мы берем аргумент time и извлекаем из него несколько полей:

Это выдаст: July 4, 2010 .

Для того чтобы печатать номера с определенной точностью, вы можете использовать параметр f , задав ширину и точность, например:

Результат может выглядеть так:

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

Общие форматы

В языке Java есть целый пакет java.text , который полон процедур форматирования как общих и гибких, так и всех, что вы можете себе представить. Как и в функции printf() , в нем используется язык форматирования, описанный на онлайн-странице документации. Рассмотрим представление чисел. В Северной Америке число “одна тысяча двадцать четыре и четверть” имеет вид 1, 024.25; в большинстве стран Европы — 1 024,25, а в некоторых других странах это может быть написано как 1.024, 25. Форматирование валют и процентов также отличается большим разнообразием. Попытка отслеживать это сама по себе быстро переутомила бы среднего разработчика программного обеспечения.

К счастью, пакет java.text включает класс Locale . Кроме того, среда выполнения Java или Android автоматически устанавливает объект класса Locale по умолчанию на основе среды пользователя; этот код работает как на настольных компьютерах в среде Java, так и на устройствах Android. Чтобы обеспечить форматирование, настроенное для чисел, валют и процентов, класс NumberFormat имеет статические встроенные методы, которые обычно возвращают объект класса Decimal Format с уже созданным шаблоном. Объект класса Decimal Format, соответствующий локализации пользователя, может быть получен с помощью встроенного метода NumberFormat.getlnstance() и управляться с использованием set-методов. Удивительно, но метод setMinimumlntegerDigits() оказывается простым способом создания формата чисел с ведущими нулями. Рассмотрим пример.

Пример 2. Пример форматирования числа

Этот код печатает содержимое массива с помощью экземпляра класса NumberFormat . Мы показываем запуск его как основной программы, а не в приложении для Android, чтобы подчеркнуть эффекты класса NumberFormat .

Например, инструкция $ java NumFormat2 0.0 форматирует нуль как 000.00 ; с аргументом 1.0 она создает представление 001.00 , число 3.142857142857143 она представляет как 003.1429 , а 100.2345678 — как 100.2346 .

Вы также можете создать объект класса DecimalFormat с определенным шаблоном или динамически изменять шаблон с помощью метода applyPattern() . В табл. 2 показаны некоторые из наиболее распространенных шаблонных символов.

Таблица 2. Общие СИМВОЛЫ шаблона DecimalFormat

Символ Значение
# Цифра (подавление ведущих нулей)
0 Цифра (указаны ведущие нули)
. Локализованный десятичный разделитель (десятичная точка)
, Локализованный разделитель групп (запятая на английском языке)
Локализованный минус (знак «минус»)
% Показывает значение в процентах
; Отделяет два формата: первый для положительного значения и второй для отрицательного
Выводит предыдущий символ как таковой
Другие Появляется без обработки

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

Пример 3. Программа демоверсии NumberFormat Java SE

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

Источник

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