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 — хорошая отправная точка. Зная и умело используя флаги, можно добиться определенной гибкости.
Источник
Time Class
Definition
Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.
This class is obsoleted in this android platform
An alternative to the java.util.Calendar and java.util.GregorianCalendar classes.
Remarks
Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.
Constructors
Construct a Time object in the default timezone.
A constructor used when creating managed representations of JNI objects; called by the runtime.
Construct a Time object in the default timezone.
Construct a Time object in the default timezone.
Fields
The Julian day of the epoch, that is, January 1, 1970 on the Gregorian calendar.
Properties
True if this is an allDay event.
Returns the runtime class of this Object .
(Inherited from Object)
Returns the timezone string that is currently set for the device.
Offset in seconds from UTC including any DST offset.
The handle to the underlying Android instance.
(Inherited from Object)
Hour of day 15
This time is in daylight savings time.
Day of month 8
Seconds 10 (2 leap seconds allowed)
This API supports the Mono for Android infrastructure and is not intended to be used directly from your code.
This API supports the Mono for Android infrastructure and is not intended to be used directly from your code.
The timezone for this Time.
Computes the week number according to ISO 8601.
Day of year 68
Methods
Returns true if the time represented by this Time object occurs after the given time.
Returns true if the time represented by this Time object occurs before the given time.
Clears all values, setting the timezone to the given timezone.
Creates and returns a copy of this object.
(Inherited from Object)
Compare two Time objects and return a negative number if a is less than b , a positive number if a is greater than b , or 0 if they are equal.
Indicates whether some other object is «equal to» this one.
(Inherited from Object)
Print the current value given the format string provided.
Format according to RFC 2445 DATE-TIME type.
Return a string in the RFC 3339 format.
Return the maximum possible value for the given field given the value of the other fields.
Returns a hash code value for the object.
(Inherited from Object)
Computes the Julian day number for a point in time in a particular timezone.
Takes a number of weeks since the epoch and calculates the Julian day of the Monday for that week.
Returns the week since #EPOCH_JULIAN_DAY (Jan 1, 1970) adjusted for first day of week.
Returns true if the instant of the supplied time would be for the Gregorian calendar date January 1, 1970 for a user observing UTC , i.
Called by the garbage collector on an object when garbage collection determines that there are no more references to the object.
(Inherited from Object)
Ensures the values in each field are in range.
Wakes up a single thread that is waiting on this object’s monitor.
(Inherited from Object)
Wakes up all threads that are waiting on this object’s monitor.
(Inherited from Object)
Parses a date-time string in either the RFC 2445 format or an abbreviated format that does not include the «time» field.
Parse a time in RFC 3339 format.
Sets the date from the given fields.
Sets the date from the given fields.
Sets the date from the given fields.
Sets the date from the given fields.
Sets the Handle property.
(Inherited from Object)
Sets the time from the given Julian day number, which must be based on the same timezone that is set in this Time object.
Sets the time of the given Time object to the current time.
Convert this time object so the time represented remains the same, but is instead located in a different timezone.
Converts this time to milliseconds.
Returns a string representation of the object.
(Inherited from Object)
Causes the current thread to wait until another thread invokes the java.lang.Object#notify() method or the java.lang.Object#notifyAll() method for this object.
(Inherited from Object)
Causes the current thread to wait until another thread invokes the java.lang.Object#notify() method or the java.lang.Object#notifyAll() method for this object.
(Inherited from Object)
Causes the current thread to wait until another thread invokes the java.lang.Object#notify() method or the java.lang.Object#notifyAll() method for this object.
(Inherited from Object)
Explicit Interface Implementations
IJavaPeerable.Disposed() | (Inherited from Object) |
IJavaPeerable.DisposeUnlessReferenced() | (Inherited from Object) |
IJavaPeerable.Finalized() | (Inherited from Object) |
IJavaPeerable.JniManagedPeerState | (Inherited from Object) |
IJavaPeerable.SetJniIdentityHashCode(Int32) | (Inherited from Object) |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) | (Inherited from Object) |
IJavaPeerable.SetPeerReference(JniObjectReference) | (Inherited from Object) |
Extension Methods
Performs an Android runtime-checked type conversion.
Источник
Как отформатировать дату и время в 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
Как узнать текущее время и дату в приложении для 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.
Затем вы можете получить все нужные поля даты, например:
ОБНОВИТЬ
Как отмечают многие, Google говорит, что у этого класса есть ряд проблем, и его больше нельзя использовать:
Этот класс имеет ряд проблем, поэтому рекомендуется использовать GregorianCalendar.
По историческим причинам при выполнении временных вычислений вся арифметика в настоящее время выполняется с использованием 32-разрядных целых чисел. Это ограничивает достоверный диапазон времени, представляемый с 1902 до 2037 года. Подробности смотрите в статье в Википедии о проблеме 2038 года. Не полагайтесь на это поведение; это может измениться в будущем. Вызов switchTimezone (String) в дату, которая не может существовать, например, в настенное время, которое было пропущено из-за перехода на летнее время, приведет к дате в 1969 году (т.е. -1 или 1 секунда до 1 января 1970 года по Гринвичу). Большая часть форматирования / синтаксического анализа предполагает использование текста ASCII и поэтому не подходит для использования со сценариями, не относящимися к ASCII.
Источник