Android text format time

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) CurrentTimezone

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

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(Time, Time)

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.

Dispose() (Inherited from Object) Dispose(Boolean) (Inherited from Object) Equals(Object)

Indicates whether some other object is «equal to» this one.

(Inherited from Object) Format(String)

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) GetJulianDay(Int64, Int64)

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) Normalize(Boolean)

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) NotifyAll()

Wakes up all threads that are waiting on this object’s monitor.

(Inherited from Object) Parse(String)

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.

Читайте также:  Тхе эскейпист 2 андроид

(Inherited from Object) SetJulianDay(Int32)

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) UnregisterFromRuntime() (Inherited from Object) Wait()

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) Wait(Int64)

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) Wait(Int64, Int32)

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!

Читайте также:  Бортовой компьютер volkswagen polo android

Другие ответы, как правило, правильные. Я хотел бы внести современный ответ. Классы 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.

Источник

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