Оригинал: http://it.deepinmind.com/java/2015/03/17/20-examples-date-ndate-di-from-java8.html
В дополнение к Lambda Expressions, Stream и нескольким небольшим улучшениям Java 8 также представила новый набор времени и даты. Даты, календари и обработку времени Java всегда подвергались критике, особенно решает определить java.util.date как модифицированный и использовать SimpleDateFormat в неэтровую безопасность. Похоже, что Java поняла, что ей необходимо обеспечить лучшую поддержку для функций времени и даты, что также является хорошей вещью для сообщества, которое привыкли к использованию базы данных Joda Time. Самое большое преимущество этой новой библиотеки времени и дат заключается в том, что она определяет некоторые концепции, связанные с временем и датой. и период. В то же время он также заимствует некоторые преимущества библиотеки Джода, такие как различие между людьми и машинами, чтобы отличить дату. Java 8 по -прежнему использует календарную систему ISO, и, в отличие от своих предшественников, классы в пакете Java.Time являются необоснованными и нитью. Новое время и дата API находится в пакете Java.Time.
Новая библиотека также добавляет ZoneOffset и зонирован, чтобы обеспечить лучшую поддержку часового пояса. С новым DateTimeFormatter анализ и форматирование даты после даты стали новыми. Просто упомяните об этом, я писал эту статью, когда Java собиралась запустить эту новую функцию в настоящее время, так что вы обнаружите, что время в этом примере - в прошлом году. Если вы запускаете эти примеры, значения, которые они возвращают, должны быть правильными.
Кто -то спросил меня, как лучше всего выучить новую библиотеку? Мой ответ - использовать его в реальных проектах. В реальном проекте будет множество потребностей, которые будут способствовать изучению и изучению этой новой библиотеки. Короче говоря, только сама задача действительно будет способствовать изучению и изучению. Новая дата и время API Java 8 то же самое. Чтобы выучить эту новую библиотеку Java 8, я создал 20 примеров, ориентированных на задачу. Давайте начнем с простой задачи. Говорят, что говорят, что разрабатывают применение напоминаний, чтобы узнать какую -то конкретную дату, такую как день рождения, воскресная годовщина, следующая дата счета, сколько дней существует для следующей даты премии или истечения срока действия кредитной карты.
В Java 8 есть класс под названием LocalDate, который можно использовать для представления даты сегодняшнего дня. Этот класс немного отличается от java.util.date, потому что он содержит только дату и не имеет времени. Поэтому, если вам нужно только указать дату вместо времени, вы можете использовать ее.
Localdate сегодня = localdate.now ();
Вы можете видеть, что он создает сегодня, но не включает информацию о времени. Он также формирует формат даты и выводит его.
Класс LocalDate предоставляет несколько очень удобных способов использования даты и других атрибутов даты, которые можно использовать для извлечения. Используя эти методы, вы можете получить любой атрибут даты, который вам нужен, и больше не нужно использовать класс, такой как java.util.calendar:
Localdate сегодня = localdate.now (); Год, месяц, день);
Видно, что очень просто получить годовую информацию в Java 8. Она должна использовать только соответствующий метод Getter, без памяти, очень интуитивно понятной. Вы можете сравнить его с написанием текущего месяца и дня в Java.
В первом примере мы видим, что очень просто сгенерировать дату дня с помощью статического метода, но с помощью другого очень полезного фабричного метода localdate.of () вы можете создать любую дату. год, месяц, а затем верните эквивалентный экземпляр LocalDate. Еще одна хорошая новость об этом методе заключается в том, что он не совершал никаких ошибок в API. То, что вы пишете здесь, это то, что вы пишете здесь, например, в следующем примере, он представляет 14 января, нет скрытой логики.
LocalDate DateOfBirth = LocalDate.of (2010, 01, 14);
Видно, что дата создания - это то, что мы пишем, 14 января 2014 года.
Говоря о фактических задачах времени обработки и дате в реальности, это общепринято, чтобы проверить, равны ли две даты. Вы можете часто сталкиваться, судить ли сегодня особенный день, такой как день рождения, годовщина или праздники. Иногда вы дадите вам свидание, чтобы проверить, является ли это определенный день. Следующий пример поможет вам выполнить такие задачи в Java 8. Как вы думаете, LocalDate переписал метод Equals для сравнения даты, как показано ниже:
LocalDate Date1 = LocalDate.of (2014, 01, 14); 2014-01-14 и дата 1 2014-01-14
В этом примере наше сравнение две даты равны. В то же время, если вы получите форматированную строку даты в коде, вы должны разрешить ее как дату, прежде чем вы сможете сравнить ее. Вы можете сравнить этот пример, чтобы сравнить ранее сравнение Java, и вы обнаружите, что это намного лучше.
Существует также практическая задача, связанная с датой времени в Java, чтобы проверить дубликаты событий. Если вы работаете в E -Commerce Company, то будет такой модуль, который отправит пользователям пожелания на день рождения и приветствует их в каждом важном празднике, например, на Рождество, День Благодарения, в Индии это может быть возможно это Дипавали. Как определить, является ли это фестивалем или повторным инцидентом в Java? Используйте класс месяца. Эта категория объединяется по месяцу и не включает годовую информацию, что означает, что вы можете использовать ее для представления некоторых дней, которые появляются каждый год. Конечно, есть некоторые другие комбинации, такие как класс Moldth. Он также не может безопасно изменить и потоковые потоки, как другие типы в новой библиотеке времени, а также класс значения. Посмотрим, как использовать MonthDay, чтобы проверить дубликат даты:
LocalDate DteAlday день рождения (2010, 01, 14); Println («Много счастливых возвращений дня !!»);
Хотя год отличается, сегодня день рождения, так что вы увидите благословение на день рождения в результате. Вы можете настроить время системы и запустить программу, чтобы увидеть, может ли она напомнить вам, когда наступает следующий день рождения.
Это очень похоже на текущую дату в первом примере. На этот раз мы используем класс под названием LocalTime. Здесь вы также можете использовать статический метод фабрики сейчас (), чтобы получить текущее время. Формат по умолчанию - HH: MM: SS: NNN, а NNN здесь - наносекунд. Это можно сравнить с тем, как получить текущее время с Java 8.
Localtive Time = localtime.now ();
Видно, что текущее время не включает дату, потому что у Localtime есть только время и нет даты.
Много раз нам нужно увеличить будущее время в каждой минуте или секунде. Java 8 не только предоставляет не изменившиеся и потоковые классы, но и предоставляет несколько более удобных методов, таких как Plushours () для замены исходного метода add (). Кстати, эти методы возвращают ссылку на новый экземпляр LocalTime, поскольку LocalTime неизменно, не забудьте сохранить эту новую ссылку.
Localtive Time = localtive.now (); : 33.369
Вы можете видеть, что через 2 часа текущего времени это 16: 33: 33.369. Теперь вы можете сравнить его с старым способом добавления или уменьшения старого пути в Java. На первый взгляд, вы знаете, какой путь лучше.
Это похоже на предыдущий пример предыдущих двух часов. LocalDate используется для указания даты без времени. Поскольку LocalDate также неизменен, любая операция модификации вернет новый пример, поэтому не забудьте сохранить его.
Localdate nextweek = сегодня IS: 2014-01-14 Дата после 1 недели: 2014-01-21
Вы можете увидеть, какая дата через 7 дней. Вы можете использовать этот метод, чтобы увеличить месяц, один год, один час, одну минуту или даже десять лет, проверить класс Chronounit в Java API, чтобы получить больше вариантов.
Это продолжение предыдущего примера. В приведенном выше примере мы узнали, как использовать метод Plus () LocalDate, чтобы увеличить дату, неделю или месяц.
LocalDate предыдущий " + nextyear); вывод: дата до 1 года: 2013-01-14 Дата после 1 года: 2015-01-14
Видно, что всего два года, один - 2013 год, а другой - 2015 год, который является годом до и после 2014 года.
Java 8 поставляется с классом часов, вы можете использовать его, чтобы получить текущее мгновенное время, дату или время в определенном часовом поясе. Вы можете использовать часы для замены System.currentTimeInmillis () и метода Timezone.getDefault ().
// Возвращает текущее время на основе ваших системных часов и установить в UTC. .Systemdefaultzone ();
Вы можете использовать указанную дату для сравнения с этими часами, например, следующим образом:
Общедоступный класс MyClass {Private Clock;Если вам нужно иметь дело с датами разных часовых поясов, это довольно удобно.
Это также общая задача в реальных проектах. Как вы судите, находится ли определенная дата перед другой датой или просто равным? В Java 8 класс LocalDate имеет методы isbefore () и isafter (), которые можно использовать для сравнения двух дат. Если дата метода вызовов ранее, чем данная дата, метод isbefore () вернет true.
Localdate tomomorrow = localdate.of (2014, 1, 15); ;
Видно, что дата в Java 8 относительно проста. Не нужно использовать другой класс, такой как календарь для выполнения аналогичных задач.
Java 8 не только отделяет дату и время, но и иногда регионы. Есть уже несколько групп, связанных с часовыми поясами. Это эквивалентно классе Gregoriancalendar до Java 8. Используя этот класс, вы можете преобразовать локальное время в соответствующее время в другом часовом поясе, например, в следующем примере:
// Дата и время с часовым поясом в Java 8 ZoneId America = ZoneId.of ("American/News"); Timezone: « + DateAndtimeinnewyork); вывод: текущая дата и время в определенном часовом поясе: 2014-01-14T16: 33.373-05: 00 [American/new_york]Его можно сравнить со временем для преобразования локального времени в время GMT. Кстати, как и до Java 8, текст в соответствующем часовом поясе не должен ошибаться, иначе вы столкнетесь с таким исключением:
Исключение в ветке "Main" java.time.zone.zonerseexception: неизвестный идентификатор времени и зоны: Asia/Tokyo на lesprovider.java:272) на java.time.zone.zonerulesprovider.getrules (zonerulesprovider.java:227) на Java. Time.zoneregy.ofid (Zoneregy.java:120) в java.time.zoneid.of (ZoneId.java:403) в java.time.zoneid.o f (ZoneId.java: 351)
Как и Monthday Days выражает дубликат, Modomonth является еще одной комбинацией. Вы можете использовать этот класс, чтобы выяснить, сколько дней в этом месяце LengthOfMonth () этот метод возвращает, сколько дней в этом году, что очень полезно для проверки, было ли это 28 дней в феврале или 29 днях.
Yearmonth custryearmonth = yearmonth.now (); ;;
Это не сложно. Если вы все еще хотите повторить колесо, вы можете увидеть этот кодекс.
if (today.isleapyear ()) {System.out.println («В этом году легальный год»);Вы можете проверить несколько лет, чтобы увидеть, являются ли результаты правильными.
Другая распространенная задача - рассчитать, сколько дней, сколько недель или лет включено между двумя данными датами. Вы можете использовать Java.time. В следующем примере мы рассчитаем в общей сложности за несколько месяцев до текущей даты и даты будущего.
LocalDate Java8Release = LocalDate.of (2014, Month.March, 14); );
Можно видеть, что в этом месяце - январь, а дата выпуска Java 8 - март, так что это на 2 месяца.
В Java 8 вы можете использовать класс ZoneOffset для представления определенного часового пояса. Пока вы получаете это смещение, вы можете использовать LocalDateTime и это смещение, чтобы создать официальное время.
Localdaletime dotetime = localdatetime.of (2014, месяц. Январь, 14, 19, 30); .println («Дата и время с временем смещено в Java:« + Дата);
Видно, что текущая дата связана с часовым поясом. Другой момент заключается в том, что OfficetDateTime в основном понимается машина.
Если вы все еще помните, как получить текущую марку времени перед Java 8, то это просто маленькое блюдо. У мгновенного класса есть статический фабричный метод теперь () для возврата текущей временной метки, следующим образом:
Instant TimeStamp = instant.now ();
Можно видеть, что текущая временная метка включает в себя дату и время, что аналогично java.util.date. в java.util.date и date.toinstant () преобразует дату в мгновенный.
Перед Java 8 форматирование даты -это техническая работа. Благодаря локальным переменным потока, это сделало его полезным в многочисленной среде, но для Java было много времени, чтобы поддерживать это состояние. На этот раз он представил новый формат безопасности и время безопасности. Он также поставляется с некоторым предопределенным форматом, который содержит обще используемый формат даты. Например, в этом примере мы используем предопределенный основной формат даты ISO , который будет отформатирован с 14 февраля 2014 года по 20140114.
String DayaFterTommorw = "20140116"; -16
Вы можете видеть, что дата генерации соответствует значению указанной строки, которая немного отличается в формате даты.
В приведенном выше примере мы использовали встроенный формат времени и даты для разрешения строки даты. Конечно, предопределенный формат действительно хорош, но иногда вам все равно потребуется использовать пользовательский формат даты. Формат даты в этом примере - «Mmm Dd Yyyy». Вы можете передать метод OfPattern Static () в DateTimeFormatter's Static (), и он вернет экземпляр. Например, М до сих пор представляет месяц, а М. все еще разделен. Неверный режим будет выбрасывать аномалии DateTimeParseException, но, например, если это логические ошибки, его следует использовать в качестве m, так что нет никакого способа.
String goodfriday = "18 апреля 2014 года"; ", Goodfriday, Holiday);} Catch (DateTimeParSexception ex) {System.out.printf ("%s не является разрабатываемой!%n ", GoodFriday); ex.printStacktr Ace ();} Вывод: успешно проанализированная строка 18 апреля 2014 , Дата-2014-04-18Видно, что значение даты действительно соответствует проходящей строке, но формат отличается.
В двух предыдущих примерах, хотя мы использовали класс DateTimeFormatter, мы в основном анализировали строку даты. В этом примере то, что мы должны сделать, это именно противоположное. Здесь у нас есть экземпляр класса LocalDateTime, и мы хотим преобразовать его в форматированную строку даты. Это самый простой и удобный способ преобразования даты в строку в Java до сих пор. Следующий пример вернет форматированную строку. Как и в предыдущем примере, нам все еще нужно использовать указанную строку режима для создания экземпляра класса DateTimeFormatter, но метод Parse в классе LocalDate не является, а его метод Format (). Этот метод вернет строку, представляющую текущую дату, а соответствующий режим определяется в введенном экземпляре DateTimeFormatter.
LocalDaletime graitudate = localdateTime.now (); System.out.printf («%s не может отформатировать!%n», grrivaldate);
Можно видеть, что текущее время представлено данным режимом «Mmm Dd Yyyy HH: MM A».
Прочитав эти примеры, я считаю, что у вас есть определенное понимание нового набора времени и даты Java 8. Теперь мы оглядываемся на некоторые из ключевых элементов этого нового API.
Каждый разработчик Java должен хотя бы понять эти пять категорий этих новых API:
Основным мешочком этой библиотеки является Java.Time, которая содержит класс, время, мгновенное и продолжительность представительской даты, времени, мгновенного и продолжительности. У него есть два суб -пакета, один -java.time.foramt.
Часовой пояс относится к областям, которые имеют одинаковое стандартное время на планете. В каждом часовом поясе существует уникальный идентификатор, а также формат региона/города (Азия/Токио) и время компенсации, начиная с Гринвичского времени. Например, время смещения Токио составляет +09: 00.
В классе OfficeTeTime фактически содержатся LocalDateTime и ZoneOffset. Он используется для указания полной даты (+06: 00 или -08: 00), которая содержит смещение времени Гринвиты (+/ -час: точки, такие как +06: 00 или -08: 00)
Класс DateTimeFormatter используется для форматирования и анализа даты в Java. В отличие от SimpleDateFormat, он не изменился и тщательно безопасен. Класс DateTimeFormatter предоставляет много предварительно определенных форматов, и вы также можете настроить желаемый формат. Конечно, согласно соглашению, он также имеет метод Parse () для преобразования строки в дату. Аналогичным образом, класс DateFormatter также имеет метод Format () для даты форматирования.
Допустим, два формата даты «Mmm D Yyyy» и «Mmm Dd Yyyy» также немного отличаются. В «2 января 2014 года» сообщит об ошибке, потому что она ожидает, что два символа пройдут за месяц. Чтобы решить эту проблему, в случае количества цифр, вы должны составить 0 впереди.
Речь идет о новой дате Java 8. Этих кратких примеров достаточно, чтобы понять некоторые новые API в этом новом API. Поскольку это объясняется на основе фактической задачи, когда она встречается на Java, нет необходимости искать время и дату. Мы научились создавать и изменить дату времени. Мы также понимаем различия между чистой датой, датой времени и часовым поясом часового пояс мы знаем, как сравнить две даты, как найти определенный день с указанной датой, такой как следующий день рождения. Много дней в день годовщины или страхования. Мы также узнали, как анализировать и отформатировать дату в методе безопасности потока в Java 8 без необходимости использовать локальную переменную потока или третью партийную библиотеку. Новый API компетентен для любой задачи, связанной с датой времени.
Если вы также заинтересованы в учебных пособиях Java 8, вы можете взглянуть на следующие учебные пособия:
Английская оригинальная ссылка