С момента выхода Java 8 в 2014 году наш древний java.util.date, наконец, больше не является единственным выбором для сроков работы и времени в Java.
Фактически, связанные с ними API даты и времени в Java всегда подвергались критике со стороны мира. Это не только потому, что его разделение дизайна неясно, но и часто может обрабатывать как даты, так и время, что очень сбивает с толку. Это также численные отображения определенных лет, месяцев и дат хранятся против людей, такие как: 0 соответствует месяцу, 11, 11 декабря, 118, соответствует 2018 году (1900 + 118) и т. Д.
Часто, когда мы получаем определенную стоимость года и месяца, нам необходимо выполнять соответствующие операции, чтобы получить точную информацию о год, месяц и дату. До нашей Java 8 мы позаимствовали отличный дизайн сторонней библиотеки с открытым исходным кодом Joda-Time и перепроектировали API даты и времени. По сравнению с предыдущим, можно сказать, что это в сто раз легче в использовании. Все связанные интерфейсы API расположены в пакете Java.Time.
Древний интерфейс даты и времени
Дата, представляющая информацию о времени
Все компьютеры в мире используют целое число типов длиной, и стоимость этого целого числа составляет количество миллисекунд относительно GMT в Великобритании (0: 0: 00, 1 января 1970 года). Например:
public static void main (string [] args) {// 1 января 1970 г. 00:00:00 Gmt. Дата даты = новая дата (1000); System.out.println (date);}Результат вывода:
// 1970-1-18: 00: 01thu 01 01 08:00:01 CST 1970
Многие люди могут задаться вопросом, 1000 означает 1 секунду до стандартного времени, так почему время проходит еще на восемь часов?
Это как -то связано с «часовым поясом». Если вы находитесь в Гринвиче, результат будет таким, как и ожидалось, но мы находимся в восточном восьмом округе Китая, и время на восемь часов раньше, поэтому основные значения, основанные на разных часовых поясах, различаются.
Дата класса действительно играл много ролей раньше. Из исходного кода можно увидеть, что существуют методы, которые могут работать с временем, методами, которые могут работать на год, месяц и день, и даже управлять часовыми поясами. Можно сказать, что этого достаточно, чтобы иметь его только в отношении операций, связанных с датой и временем.
Но это мир. Если вы слишком заботитесь, вы, естественно, не сможете покрыть все. Дизайн многих методов в дате не очень разумный. Мы также говорили это раньше, и это даже немного античеловек. Следовательно, почти 80% методов в текущем классе даты были заброшены и отмечены @Deprecected.
Нынешнее позиционирование Sun Company для даты состоит в том, чтобы представлять только момент, поэтому ее внутренняя позиция должна вращаться вокруг миллисекундов этого целого числа, и больше не сосредоточиться на различных ежегодных календарных часовых поясах и другой информации.
Дата позволяет создать объект через два конструктора:
Private Transiet Long Fasttime; Public Date () {this (System.CurrentTimeMillis ());} Public Date (Long Date) {FASTTIME = DATE;}Атрибут FASTTIME здесь хранит количество миллисекундов, соответствующих времени. Два конструктора все еще очень просты. Если вызывается конструктор без параметра, виртуальная машина назначит FASTIME с текущим временным значением системы.
Есть несколько других методов, которые не были отброшены:
Есть два других метода, которые вновь добавлены в JDK1.8 впоследствии и используются для конвертации новых интерфейсов в Java 8, которые будут представлены позже.
Календарь, описывающий альманак
Календарь используется для представления информации о дате, такой как год, месяц, день и т. Д. Это абстрактный класс, поэтому его объект экземпляра обычно получается следующими четырьмя заводскими методами.
Общественный статический календарь GetInstance () Общественный статический календарь GetInstance (зона часового пояса) Общественный статический календарь GetInstance (Locale Alocale) Общественный статический календарь GetInstance (зона часового пояса, Locale Alocale)
Фактически, тот же внутренний метод в конечном итоге будет называться:
Частный статический календарь CreateCalendar (зона часового пояса, Locale Alocale)
Этот метод требует двух параметров, один - часовой пояс, а другой - страна и язык. То есть создание экземпляра календаря требует как минимум этих двух параметров, в противном случае будет использоваться часовой пояс системы по умолчанию или языковой информации.
Поскольку разные часовые пояса и национальные языки выводят по -разному в течение времени и года, месяца и дня, это также причина, по которой экземпляр календаря должен пройти в часовой пояс и информации страны. См. Пример:
public static void main (string [] args) {календарный календарь = calendar.getInstance (); System.out.println (Calendar.getTime ()); Календарь календарь1 = календарь.getinstance (timezone.gettimezone ("GMT"), locale.english); System.out.println (calendar1.get (calendar.year) + ":" + calendar1.get (calendar.hour) + ":" + calendar1.get (calendar.minute)); }Результат вывода:
Сб 21 апреля 10:32:20 CST 20182018: 2: 32
Как вы можете видеть, первым выводом является текущее время часового пояс нашей системы по умолчанию и страны, а также второй экземпляр календаря, который мы указали, что он расположен в часовом поясе Гринвич (0 часового пояса), и результат также очевиден, с разницей восьми часов, потому что мы находимся в Восточном восьмом, что на восемь часах раньше, чем в часовой зоне 0.
Некоторые люди могут задаться вопросом, почему результаты второго экземпляра календаря настолько сложны для сплайсинга, вместо того, чтобы вызывать метод GETTIME непосредственно кратко, как первый экземпляр календаря?
Это включает внутреннюю реализацию календаря, давайте вместе посмотрим:
Защищено долго;
Как и дата, календарь поддерживает информацию времени внутри, а метод Get Time фактически создает объект даты на основе этого времени и возвращает.
Как правило, когда мы строим экземпляр календаря, мы не будем передавать информацию о времени, поэтому, когда экземпляр будет инициализирован, программа будет рассчитывать миллисекундное число на основе часового пояс системы по умолчанию и текущего времени и назначать его времени.
Следовательно, внутри всех экземпляров календаря, чье значение атрибута времени не было изменено вручную, значение времени - это значение временного часового пояса в то время. Другими словами, выходной результат GetTime игнорирует информацию о часовом поясе, соответствующую текущему экземпляру. Это также недостаток в конструкции календаря, потому что это приведет к тому, что выходное значение времени получения двух экземпляров календаря зависит только от времени выполнения системы, когда экземпляр инициализируется.
Календарь также определяет многие статические константы и некоторые массивы атрибутов:
Public Final Static int era = 0; публичный окончательный статический int year = 1; public final Static int month = 2; public final int week_of_year = 3; public final int int week_of_month = 4; публичная окончательная статическая дата int = 5; .... защищенные поля int [];
Вся соответствующая информация о датах хранится в массиве атрибутов, и значения этих статических констант часто представляют значение индекса. С помощью метода GET мы передаем индекс атрибутов и возвращаем значение атрибута. Например:
Календарь mycalendar = calendar.getInstance (); int Год = mycalendar.get (calendar.year);
Метод GET здесь фактически должен принять поля [1] в качестве возвращаемого значения. Массив атрибутов Fields рассчитывается и назначается системой в соответствии с часовым поясом и языком, когда инициализируется экземпляр календаря. Обратите внимание, что он будет рассчитан на основе указанного вами часового пояса, в отличие от времени, который всегда основан на часовом пояске системы по умолчанию.
Я лично думаю, что дизайн календаря имеет элегантные и необоснованные аспекты. В конце концов, это «антикварный» и в конечном итоге будет заменен.
Дата формата преобразование формата
Как мы видим из одного из наших предыдущих примеров, очень трудно выводить информацию даты в ожидаемом формате для календаря и необходимо сама по себе сплачивать вручную. Наша DateFormat используется для обработки преобразования между форматированными строками и времени.
Как и календарь, DateFormat также является абстрактным классом. Нам нужно генерировать его объект экземпляра с помощью заводских методов. Есть в основном следующие фабричные методы:
// Только обработка времени преобразования времени публичная окончательная статическая дата dateFormat getTimeInstance () // Только конверсию даты обработки
Конечно, у каждого из них есть свои методы перегрузки, и мы увидим детали позже.
Существует два типа методов для DateFormat, Format и Parse.
Публичный окончательный формат строки (дата дата) Общественная дата Parse (String Source)
Метод формата используется для форматирования объекта даты в качестве строки, а метод Parse используется для замены форматированной строки на объект даты. Например:
public static void main (string [] args) {календарный календарь = calendar.getInstance (); DateFormat DateFormat = dateFormat.getDateTimeInstance (); System.out.println (dateformat.format (calendar.gettime ()));}Результат вывода:
2018-4-21 16:58:09
Очевидно, что экземпляр DateFormat, построенный на заводе, не может настроить контент форматирования выходного форматирования, то есть формат выходной строки фиксирован и в некоторых случаях не может удовлетворить особые потребности. Как правило, мы будем напрямую использовать один из его классов реализации, SimpleDateFormat.
SimpleDateFormat позволяет вам передавать параметр шаблона при создании экземпляра для настройки выходного формата символов даты. Например:
public static void main (string [] args) {dateformat dateformat = new SimpleDateFormat ("yyyyy Year Mm Month Day"); System.out.println (dateformat.format (new Date ()));}Результат вывода:
21 апреля 2018 года
в,
Конечно, также очень удобно конвертировать даты строк. Индивидуальные режимы разрешены, но вы должны соблюдать схемы, которые вы устанавливаете самостоятельно, в противном случае программа не сможет успешно разобраться. Например:
public static void main (string [] args) {string str = "Суббота, 21 апреля 2018 года"; DateFormat sdateFormat = new SimpleDateFormat ("Yyyy Year M Месяц DD DD DD HH Point E. Point E"); sdateformat.parse (str); System.out.println (sdateformat.getCalendar (). GetTime ());}Результат вывода:
SAT 21 апреля 17:17:00 CST 2018
Очевидно, что программа правильно анализирует нашу строку и преобразует ее в календарный объект, хранящийся внутри DateFormat.
В целом, дата, календарь и DateFormat смогли справиться с общими проблемами и датой, но неизбежно они все еще громоздки и трудно использовать.
Из -за ограничений пространства мы сравним новую API даты и времени Java 8 в следующей статье, и вы обнаружите, что у него более элегантный дизайн и простая работа.