Как вы правильно отформатируете в соответствии с конфигурацией устройства дату и время, когда у вас есть год, месяц, день, час и минута?
Использовать стандартный класс Java DateFormat.
Например, чтобы отобразить текущую дату и время, выполните следующие действия:
Вы можете инициализировать объект Date своими собственными значениями, однако вы должны знать, что конструкторы устарели, и вы действительно должны использовать объект Java Calendar.
По-моему, android.text.format.DateFormat.getDateFormat(context) меня смущает, потому что этот метод возвращает java.text.DateFormat , а не android.text.format.DateFormat — — «.
Итак, я использую код фрагмента, как показано ниже, чтобы получить текущую дату/время в моем формате.
Кроме того, вы можете использовать другие форматы. Следуйте DateFormat.
Вы можете использовать DateFormat . Результат зависит от языка Locale по умолчанию, но вы также можете указать Locale:
Это результаты на телефоне во французском языке:
==> vendredi 3 ноября 2017
==> 3 нов. 2017 16:04:58
==> 03/11/2017 16:04:58 GMT + 01: 00
==> 03/11/2017 16:04:58 heure normale dEurope centrale
==> 16:04:58 GMT + 01: 00
==> 16:04:58 heure normale dEurope centrale
Дата для строки даты локали:
— > 31 декабря 1969 года
— > 31 декабря 1969 года 4:00:00 PM
Это будет сделано:
Лучше использовать собственный язык Android. Класс времени:
Использовать SimpleDateFormat
Используйте эти два как переменные класса:
И используйте его следующим образом:
Это мой метод, вы можете определять и вводить и выводить формат.
Использовать сборку в классе времени!
Я использую SimpleDateFormat без настраиваемого шаблона, чтобы получить фактическую дату и время из системы в формате, выбранном устройством:
возвращает
Этот код вернет текущую дату и время:
Другие ответы, как правило, правильны. Я хотел бы внести современный ответ. Классы Date , DateFormat и SimpleDateFormat , используемые в большинстве других ответов, давно устарели и вызвали проблемы для многих программистов на протяжении многих лет. Сегодня у нас намного лучше в java.time , AKA JSR-310, современном API дат и времени Java. Можете ли вы использовать это на Android еще? Несомненно! Современные классы были отправлены на Android в проект ThreeTenABP. См. этот вопрос: как использовать ThreeTenABP в Android Project для всех деталей.
Этот фрагмент должен начать работу:
Когда я задаю предпочитаемый язык моим компьютерам на английском или английском английском, это напечатает:
Когда я устанавливаю его на датский, я получаю:
Таким образом, он выполняет настройку. Я точно не знаю, насколько подробно он соответствует вашим настройкам даты и времени, и это может отличаться от телефона к телефону.
Monday, July 1, 2013
Форматирование даты/времени в Andro >
Одним из аспектов локализации приложения является представление времени и даты в соответствии с настройками устройства. Различные страны/регионы используют разные форматы, как следствие, нужно учитывать ряд моментов.
Первая мысль, которая приходит в голову — это использование 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 — хорошая отправная точка. Зная и умело используя флаги, можно добиться определенной гибкости.
Когда я использую флаг «HH» в android.text.format.DateFormat , он интерпретируется как буквальный «HH». Но когда я использую java.text.SimpleDateFormat он интерпретируется как 2-значный Час. Почему они разные?
Я не ищу рабочую альтернативу (я уже знаю, что мне нужно использовать kk вместо HH ). Мне просто интересно, почему «HH» не признается.
Я ожидаю, что оба будут 26-05-2013 22:36:34
Есть ли у Android DateFormat ошибка?
Java SimpleDateFormat принимает эти:
Таким образом, разработчики Android решили изменить значение k а в их функции DateFormat он эквивалентен SimpleDateFormat H как они прямо говорят на странице документации :
Что является причиной этого?
Я понимаю, что вы уже приняли ответ, но просто для того, чтобы полностью объяснить это вам …
Из исходного кода для DateFormat.java …
Методы <@code format>в этом классе реализуют подмножество Unicode UTS # 35 . Подмножество, поддерживаемое этим классом, включает следующие символы формата: <@code acdEHhLKkLMmsyz>. До уровня API уровня 17 поддерживались только <@code adEhkMmszy>. Обратите внимание, что этот класс неправильно реализует <@code k>, как если бы он был <@code H>для обратной совместимости.
Обратите внимание на ту часть, которую я выделил жирным шрифтом.
Источник, с которым я связан, был обновлен, чтобы разрешить использование H, но он еще не находится в общем выпуске (API 17 – это текущая версия Android и не поддерживает H).
Позже в источнике, на этапе объявления символьных констант формата, есть этот комментарий …
… и позже во время замены персонажа …
Потому что … это не одно и то же, и он ведет себя так, как говорится в документации.
Из документации для android.text.format.DateFormat
Этот класс поддерживает только подмножество полной спецификации Unicode. Используйте SimpleDateFormat, если вам нужно больше.
Но если вы прочтете документы далее :
Public static final char HOUR_OF_DAY
Этот указатель указывает час дня в 24-часовом формате. Пример для 3 вечера: k -> 15 Примеры для полночи: k -> 0 kk -> 00
Итак … используя этот класс, это будет kk вместо HH
Для android.text.format.DateFormat вы назначаете Hour in day как kk следующим образом:
Для java.text.SimpleDateFormat вы назначаете час в день как HH .
Документация для android.text.format.DateFormat:
Public static final char HOUR_OF_DAY
Этот указатель указывает час дня в 24-часовом формате. Пример для 3 вечера: k -> 15 Примеры для полночи: k -> 0 kk -> 00
Я никогда не программировал для Android. Я googled DateFormat javadoc и увидел там следующие примеры:
«Час» отмечен маленькой буквой h в противоположность SimpleDateFormat где для этой цели используется заглавная буква.
Эта работа для всех Android 4.0+ и для двух дат.
24-часовой формат использует этот шаблон даты = « dd-MM-yyyy HH: mm »;
12-часовой формат использует этот шаблон даты = » dd-MM-yyyy hh: mm a «;