В этом руководстве вы научитесь работать с датами и временем в Java и в приложениях Android. Данные о дате и времени могут быть определены, изменены и сохранены различными способами.
Приложения Android написаны на Java, языке программирования. В Java есть несколько примитивных типов данных для различных типов чисел (целые числа, числа с плавающей запятой и т. Д.), Логических значений и одиночных символов. Java также включает в себя множество классов для хранения, форматирования и изменения данных даты и времени для использования в ваших приложениях Android. В этом руководстве вы узнаете, как определить текущую дату и время, сохранить данные о дате и времени и отобразить их несколькими способами.
Что вам нужно
Технически, вам не нужны никакие инструменты для завершения этого урока, но вам, безусловно, они понадобятся для разработки приложений для Android.
Для разработки приложений Android (или любых других приложений Java) вам необходима среда разработки для написания и создания приложений. Eclipse — это очень популярная среда разработки (IDE) для Java и предпочтительная IDE для разработки под Android. Он свободно доступен для операционных систем Windows, Mac и Linux.
Полные инструкции по установке Eclipse (включая поддерживаемые версии) и Android SDK см. На веб-сайте разработчиков Android .
Что такое дата или время, правда?
Перво-наперво: дата и время — это две части одного и того же фрагмента данных (момент времени). Когда дело доходит до хранения даты и времени на компьютере, может быть полезно вспомнить ваш первый компьютерный класс и вспомнить, что все данные на компьютере состоят из «единиц и нулей». Компьютеры (и устройства Android не являются исключением) на самом деле не имеют ощущения времени, как люди, но вместо этого сохраняют числовое представление текущей даты или времени (всегда тикают вперед, по одной миллисекунде за раз), а затем форматируют эту информацию в различные способы удовлетворить конкретные цели. В конце концов, один момент времени интерпретируется по-разному в зависимости от вашего часового пояса или местоположения, признаете ли вы (или ваш район) переход на летнее время и различные другие факторы.
Добавьте к этому тот факт, что даты и время отображаются по-разному в разных культурах и регионах. Например, в Соединенных Штатах мы часто форматируем наши даты следующим образом: 6 апреля 1981 г. или 04/06/1981, тогда как в Европе день обычно предшествует месяцу, например: 6 апреля 1981 г. или 06/04 / 1981. Аналогичным образом, в некоторых странах существует концепция AM и PM с 12-часовым режимом, тогда как в других просто используются 24-часовые часы.
Компьютеры, включая устройства Android, рассчитывают время и дату как одно число (длинное), которое увеличивается с течением времени. Само число соответствует количеству миллисекунд, прошедших с определенной даты в прошлом. В этом случае момент времени, в который начало отсчитываться «время», это: полночь, 1 января 1970 года. Этот механизм называется временем Unix или временем POSIX .
Что делать разработчику?
Поп-викторина! Какая из следующих строк правильно представляет 4-й месяц (григорианского) календарного года: A, апрель, апрель, апрель, 4 или 04? Ответ? Все они. Работа с датами и временем уже кажется немного сложной, не так ли? На самом деле, мы быстро просмотрели все справочники по Java в нашем офисе (не так уж существенно) и очень мало освещали даты и время каким-либо существенным образом. Но не паникуйте. Просто примите тот факт, что, как разработчик, вам придется приложить немного усилий для достижения двух целей:
1. Ваша внешняя цель: позволить пользователю работать с форматами даты и времени, которые ему наиболее удобны или, по крайней мере, знакомы.
2. Ваша внутренняя цель: сохранить код приложения независимым от формата, чтобы он работал везде без особых хлопот.
Теперь давайте немного поговорим о каждой из этих целей.
Внешняя цель: быть гибким и использовать стандартные элементы управления
Вы когда-нибудь замечали, что несколько туристических сайтов позволяют пользователю вручную вводить информацию о дате или времени? Вместо этого они полагаются на средства выбора календаря и выпадающие списки с фиксированным днем, месяцем и годом или, как минимум, применяют определенный формат даты (обычно привязанный к вашему языку / стране, который они запрашивают заранее). С точки зрения пользовательского интерфейса, ваши приложения должны учитывать нюансы даты и времени, по крайней мере, до некоторой степени. Тем не менее, вы также должны внимательно рассмотреть методы, с помощью которых пользователь может вводить информацию о дате и времени. Используя стандартные средства выбора даты и времени в своих приложениях для Android, такие как DatePicker и TimePicker, вы эффективно ограничиваете ввод данных, которые пользователи могут вводить, тем, что может быть легко преобразовано в соответствующие структуры даты и времени, без необходимости разбора всех известных форматов (не для упомянуть его опечатки).
Внутренняя цель: сохранить свои даты и время родовыми
С точки зрения внутреннего кода, ваши приложения должны использовать общее представление даты / времени, которое не зависит от этих нюансов.
В Java даты и время хранятся несколькими способами, в зависимости от ваших требований.
- Длинный тип — это примитивный тип данных, способный хранить количество миллисекунд, прошедших с определенного момента времени (время Unix).
- Класс Date (java.util.Date) — это служебный класс для хранения даты и времени способом, которым можно разумно манипулировать без необходимости постоянно думать о времени в миллисекундах.
- Класс Calendar (java.util.Calendar) — это служебный класс для работы с различными календарями, а также для манипулирования информацией о дате и времени различными способами.
- Класс GregorianCalendar (подкласс java.util.Calendar) используется главным образом для манипулирования датами в западном полушарии, где мы используем 12-месячный календарь, с 7 днями до недели и двумя эпохами (BC и AD).
Определение текущей даты и времени
Существует несколько способов определения текущего времени на устройстве Android.
Вы можете определить необработанные данные даты и времени, используя статический метод, предоставленный в классе System (java.lang.System):
long msTime = System.currentTimeMillis (); Date curDateTime = новая дата (msTime);
Этот метод основан на времени, когда устройство думает, что это так, что может быть или не быть надежным. Другой способ определения текущей даты и времени использует конструктор по умолчанию для класса Date, который создает объект Date с текущей датой и временем:
Date anotherCurDate = new Date ();
Есть и другие способы определения истинного точного времени — компьютеры часто проверяют известные серверы учета времени, чтобы убедиться, что все «синхронизированы». Этот процесс несколько выходит за рамки этого учебного пособия, но достаточно сказать, что просто запрос и получение правильного времени занимает некоторое время, которое затем необходимо учитывать, прежде чем синхронизация действительно может быть достигнута.
(Примечание. Устройства Android, которые подключаются к сотовым службам, как правило, имеют точную информацию о дате и времени, так как они могут использоваться для связи с радиомачтами.)
Создание даты и времени с нуля
А теперь, что если вы хотите создать переменную даты или времени с определенной даты, например дня рождения. Возможно, вы знаете, на макушке головы, количество миллисекунд с полуночи 01.01.1970 года, которое представляет ваш день рождения. В моем случае это будет что-то вроде 229703700 миллисекунд или утром 12 апреля 1977 года (с учетом времени по Калифорнии). Однако, как видите, это очень громоздко. На самом деле, вы хотите сказать: компьютер, создайте мне переменную даты / времени, представляющую 12 апреля 1977 года. Вот где в игру вступает класс Calendar:
GregorianCalendar bday = новый GregorianCalendar (1977, Calendar.APRIL, 12);
Вы можете использовать объекты календаря для манипулирования датами и извлечения интересной информации о них. Например, вы можете использовать метод get (), чтобы определить день недели, когда я родился:
int dayOfWeek = bday.get (Calendar.DAY_OF_WEEK); // Возвращает 3 за вторник!
Обратите внимание, что месяцы календаря основаны на 0, поэтому январь — это месяц 0, а не месяц 1, и, следовательно, апрель — месяц 3, а не 4. Наконец, вы можете извлечь объект Date из конфигурации даты календаря, используя getTime () метод.
Форматирование даты и времени
Вы можете использовать вспомогательный класс DateFormat (java.text.DateFormat) для преобразования необработанной информации о дате и времени в различные строковые форматы (для разных локалей и т. Д.) Или для анализа строковой информации в соответствующие биты даты и времени для использования в коде. ,
Например, вы можете использовать класс SimpleDateFormat (подкласс класса DateFormat) для создания пользовательской строки, содержащей информацию о дате и времени. Во-первых, вы должны указать строку формата, используя соответствующие коды для разных битов информации (подробности об отдельных кодах см. В документации SimpleDateFormat). Затем вы применяете эту информацию к определенной дате или времени. Например:
Date anotherCurDate = new Date (); SimpleDateFormat formatter = new SimpleDateFormat («EEEE, MMMM d» в «чч: мм а» в году «гггг G»); String formattedDateString = formatter.format (anotherCurDate);
Если бы вы печатали строку под названием formattedDateString, вы могли бы увидеть что-то вроде: «Понедельник, 6 декабря, в 8:34 утра 2010 года нашей эры».
Кстати, вы также можете использовать классы DateFormat и SimpleDateFormat для разбора строк даты и времени в соответствующий класс Date. Надеюсь, вы не будете тратить много времени на анализ введенных пользователем дат (что, как правило, довольно раздражает), но использование механизма синтаксического анализа полезно. Например, вы можете захотеть проанализировать метки времени из файла XML, где вы заранее контролируете или знаете формат метки времени, и, следовательно, можете сгенерировать соответствующую строку формата для анализа.
Отображение даты и времени для пользователя
Существует множество способов отображения информации о дате и времени для пользователя. То, как вы выбираете, зависит от ваших требований.
Возможно, самый простой способ — просто отобразить определенную дату или время в виде правильно отформатированной строки. Этот метод наиболее удобен для фиксированных дат или времени, таких как дни рождения или события. Просто используйте служебный класс DateFormat, чтобы создать соответствующую строку и отобразить ее на экране, как и любой другой текст (например, в элементе управления TextView).
Чтобы показать время, проходящее «в реальном времени», вы можете использовать элементы управления AnalogClock (см. Рисунок) или DigitalClock.
Совет: Ищете таймер? Проверьте управление хронометра.
Завершение
Дата и время являются важными типами данных, с которыми разработчики Java неизбежно должны работать. Внутренне устройства хранят информацию о дате и времени в цифровом виде, но пользователи интерпретируют эту информацию по-разному и в разных форматах. Держите эти нюансы под контролем, ограничивая способы, которыми пользователи могут вводить даты и время, используя встроенные элементы управления выбора, и убедитесь, что ваш код использует общее представление этой информации, например, используя один из многих классов, доступных для хранения информации о дате и времени.
Об авторах
Разработчики мобильных приложений Лорен Дарси и Шейн Кондер являются соавторами нескольких книг по разработке Android: углубленная книга по программированию под названием « Разработка беспроводных приложений для Android» и « Разработка Android-приложений Sams TeachYourself за 24 часа» . Когда они не пишут, они тратят свое время на разработку мобильного программного обеспечения в своей компании и оказание консультационных услуг. С ними можно связаться по электронной почте [email protected] , через их блог на androidbook.blogspot.com и в Twitter @androidwireless .