Как localdate перевести в date java
Класс LocalDate из пакета java.time предназначен для работы с датами. Функционал этого класса позволяет создавать даты и изменять их, добавляя и отнимая необходимое количество дней/месяцев/лет.
Основные методы LocalDate:
- static LocalDate now() : возвращает объект, который представляет текущую дату
- static LocalDate of(int year, int month, int day) : возвращает объект, который представляет дату с определенными годом, месяцем и днем
- int getYear() : возвращает год даты
- int getMonthValue() : возвращает месяц
- int getDayOfMonth() : возвращает день месяца (значение от 1 до 31)
- int getDayOfYear() : возвращает номер дня года (значение от 1 до 365)
- DayOfWeek getDayOfWeek() : возвращает день недели в виде значения перечисления DayOfWeek
- LocalDate plusDays(int n) : добавляет к дате некоторое количество дней
- LocalDate plusWeeks(int n) : добавляет к дате некоторое количество недель
- LocalDate plusMonths(int n) : добавляет к дате некоторое количество месяцев
- LocalDate plusYears(int n) : добавляет к дате некоторое количество лет
- LocalDate minusDays(int n) : отнимает от даты некоторое количество дней
- LocalDate minusMonths(int n) : отнимает от даты некоторое количество месяцев
- LocalDate minusWeeks(int n) : отнимает от даты некоторое количество недель
- LocalDate minusYears(int n) : отнимает от даты некоторое количество лет
Получение информации о текущей дате:
import java.time.DayOfWeek; import java.time.LocalDate; public class Program < public static void main(String[] args) < LocalDate date = LocalDate.now(); // получаем текущую дату int year = date.getYear(); int month = date.getMonthValue(); int dayOfMonth = date.getDayOfMonth(); DayOfWeek dayOfWeek = date.getDayOfWeek(); System.out.println(date); System.out.println(dayOfWeek); System.out.printf("%d.%d.%d \n", dayOfMonth, month, year); >>
2018-11-11 SUNDAY 11.11.2018
Создание и получение информации по случайной дате:
LocalDate date = LocalDate.of(1914, 12, 31); System.out.println(date);
Операции с датами — добавление и удаление:
LocalDate date = LocalDate.of(1914, 7, 28); date = date.plusYears(4); date = date.plusMonths(3); date = date.plusDays(14); System.out.println(date); // 1918-11-11 date = date.minusMonths(10); date = date.minusDays(3); System.out.println(date); // 1918-01-08
LocalDate, LocalTime, LocalDateTime
Обработка дат и времени — довольно сложная задача. В мире существует большое количество часовых поясов, которые периодически меняются. Нужно учитывать переход на зимнее и летнее время, секунды координации, високосные года и многое другое.
Java уже довольно много лет, и попыток создать классы для обработки дат было несколько.
Это возможно с помощью:
- java.util.Date — самый «старый» способ. Большая часть методов отмечена устаревшими, но сам класс до сих пор используется довольно часто
- java.util.Calendar — обычно используется совместно с java.util.Date
- Пакет java.time — новый способ, сильно превосходит предыдущие по удобству и функционалу. Его мы и рассмотрим в данной статье
Пакет java.time
Наиболее удобный и современный способ работы с датой и временем. Берёт своё начало от библиотеки Joda-Time .
Есть два базовых способа представления времени.
- Один способ представляет время в терминах человека, таких как год, месяц, день, час, минуты и секунды.
- Второй способ представляет машинное время, измеряя время непрерывно с начала, называемого эпохой, в наносекундах.
Пакет Date-Time содержит большое количество классов, представляющий дату и время. Некоторые классы в Date-Time API представляют машинное время, некоторые человеческое.
Сначала нужно определить, какие аспекты даты и времени нам нужны, затем выбрать класс или классы, которые подходят под наши нужды.
Например, мы можем выбрать LocalDate для хранения даты рождения, так как многие люди празднуют день рождения в тот же день, независимо от того, находятся ли они в месте рождения или на другом конце Земли. Если нам нужно астрологическое время, то мы можем использовать LocalDateTime , чтобы показать дату и день рождения, либо ZonedDateTime , который дополнительно содержит часовой пояс. Если мы создаём временную отметку, то вероятнее всего мы захотим использовать Instant , который позволяет сравнивать одну временную отметку с другой.
1. LocalDate
Класс LocalDate хранит год, месяц и день. Он используется для хранения и обработки даты без времени. Примеры создания:
LocalDate date = LocalDate.now();
В дополнение к обычным методам, класс LocalDate содержит методы для получения информации о дате. Метод getDayOfWeek возвращает день недели. Например, следующий код вернёт TUESDAY :
DayOfWeek dow = LocalDate.of(2019, Month.JUNE, 4).getDayOfWeek();
Следующий пример использует класс TemporalAdjuster , чтобы получить дату следующей пятницы от указанной даты:
import java.time.LocalDate; import java.time.temporal.TemporalAdjusters; import static java.time.DayOfWeek.FRIDAY; import static java.time.Month.JUNE; public class LocalDateDemo < public static void main(String[] args) < LocalDate date = LocalDate.of(2019, JUNE, 3); LocalDate nextFriday = date.with(TemporalAdjusters.next(FRIDAY)); System.out.printf("For the date of %s, the next Friday is %s.%n", date, nextFriday); > >
2. LocalTime
Класс LocalTime оперирует только временем. Он полезен для хранения времени открытия/закрытия магазина и т.д. Пример:
import java.time.LocalTime; public class LocalTimeDemo < public static void main(String[] args) < LocalTime time = LocalTime.now(); System.out.println(" " + time.getHour() + " " + time.getMinute() + " " + time.getSecond()); > >
Класс LocalTime не сохраняет информацию о часовом поясе и летнем/зимнем времени.
3. LocalDateTime
Класс LocalDateTime хранит дату и время. Он является чем-то вроде комбинации LocalDate и LocalTime . В дополнение к методу now() , который есть у каждого временного класса, класс LocalDateTime содержит большое количество методов of() , которые позволяют создать экземпляры LocalDateTime . Метод from конвертирует экземпляр другого класса в LocalDateTime . Также есть методы для добавления и вычитания часов, минут, дней и недель. Пример:
import java.time.Instant; import java.time.LocalDateTime; import java.time.Month; import java.time.ZoneId; public class LocalDateTimeDemo < public static void main(String[] args) < System.out.printf("now: %s%n", LocalDateTime.now()); System.out.printf("May 15, 2019 11:30am: %s%n", LocalDateTime.of(2019, Month.MAY, 15, 11, 30)); System.out.printf("now (from Instant): %s%n", LocalDateTime.ofInstant(Instant.now(), ZoneId.systemDefault())); System.out.printf("6 months from now: %s%n", LocalDateTime.now().plusMonths(6)); System.out.printf("6 months ago: %s%n", LocalDateTime.now().minusMonths(6)); > >
Этот код выведет в консоль:
now: 2019-06-06T20:14:24.817 May 15, 2019 11:30am: 2019-05-15T11:30 now (from Instant): 2019-06-06T20:14:24.896 6 months from now: 2019-12-06T20:14:24.897 6 months ago: 2018-12-06T20:14:24.897
Как задать дату в java
В Java даты представлены классом java.util.Date и его наследниками, такими как java.sql.Date , java.util.Calendar и java.time.* .
Вот несколько способов задать дату в Java :
С помощью конструктора java.util.Date() :
Date date = new Date(); // текущая дата и время
С помощью конструктора java.util.Date(long date) :
Date date = new Date(1648483200000L); // 27 марта 2022 года, 00:00:00 по UTC
С помощью метода java.util.Calendar.getInstance() :
Calendar calendar = Calendar.getInstance(); // задаем год, месяц и день calendar.set(2022, Calendar.MARCH, 27); Date date = calendar.getTime();
С помощью метода java.time.LocalDate.of() из Java 8 и выше:
LocalDate localDate = LocalDate.of(2022, 3, 27); Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
Важно учитывать, что объект java.util.Date не имеет информации о часовом поясе, поэтому при необходимости необходимо использовать классы java.util.Calendar или java.time.* , которые поддерживают временные зоны.
Java 8 — преобразование даты в LocalDate и LocalDateTime
2.1 Вопрос : если Date не имеет понятия о часовом поясе, поэтому часовой пояс будет отображаться, пока мы распечатываем Date объект? Например :
// Пт Авг 19 11:52:06 MYT 2016 System.out.println(new Date()); // MYT = часовой пояс моей системы по умолчанию
Ответ : Проверьте java.uti.Date.toString() исходный код, если вы распечатаете Date объект, часовой пояс системы по умолчанию будет добавлен и отображен вместе.
public String toString() < // . опущены . TimeZone zi = date.getZone(); if (zi != null) < sb.append(zi.getDisplayName(date.isDaylightTime(), TimeZone.SHORT, Locale.US)); // zzz >else < sb.append("GMT"); >sb.append(' ').append(date.getYear()); // гггг return sb.toString(); >
Заметка
Такое поведение является недостатком дизайна начиная с JDK1.1, оно вносит много путаницы. Опять же, java.util.Date не хранит информацию о часовом поясе, но если вы распечатаете ее, системный часовой пояс по умолчанию будет отображаться вместе.
ЧИТАТЬ ТАКЖЕ: Ваш проект должен быть настроен на использование JDK для использования JSP
2.2 Вопрос : для Date преобразования, почему нам нужно добавить системный часовой пояс по умолчанию для java.time.instant ?
Ответ : Обратитесь к вышеупомянутым 2.1 Вопросам и ответам. Просмотрите другой пример:
1. Дата = 19/08 / 2016T10: 00: 00 2. Системный часовой пояс по умолчанию = +08: 00 [Asia / Kuala_Lumpur] 3. Дата (печать) = 19/08 / 2016T10: 00: 00 + 08: 00 = 19/08 / 2016T18: 00: 00
Цель конверсии — убедиться, что оба Date и распечатать LocalDate будет генерировать тот же результат.
// Предположим 19/08 / 2016T10: 00: 00 = 1000 // часовой пояс системы по умолчанию = +8 1. Дата (1000) -> Печать даты (1000) = 1000 + 08: 00 // мы всегда видим «1000 + 08: 00» (но Дата по-прежнему 1000) 2. Дата (1000) -> Мгновенная (1000) // момент не имеет часового пояса или смещения нуля (UTC + 0 / Z) 3. Мгновенное (1000) -> LocalDate (1000) -> Печать LocalDate (1000) = 1000 // Результат 1000, отличается от даты печати! 4. LocalDate (1000) + 08:00 -> LocalDate (1000 + 08: 00) // добавить часовой пояс по умолчанию +8 5. Распечатать LocalDate (1000 + 08: 00) = 1000 + 08: 00
3. java.time -> Дата
Этот пример показывает вам, как конвертировать LocalDate , LocalDateTime а также ZonedDateTime вернуться к классике java.util.Date
package com.csharpcoderr.java8; import java.time.*; import java.util.Date; public class JavaTimeToDate < public static void main(String[] args) < // Азия / Куала Лумпур +8 ZoneId defaultZoneId = ZoneId.systemDefault(); System.out.println("System Default TimeZone : " + defaultZoneId); LocalDate localDate = LocalDate.of(2016, 8, 19); Date date = Date.from(localDate.atStartOfDay(defaultZoneId).toInstant()); System.out.println("n1. LocalDate ->Date"); System.out.println("localDate : " + localDate); System.out.println("date : " + date); LocalDateTime localDateTime = LocalDateTime.of(2016,8,19,21,46,31); Date date2 = Date.from(localDateTime.atZone(defaultZoneId).toInstant()); System.out.println("n2. LocalDateTime -> Date"); System.out.println("localDateTime : " + localDateTime); System.out.println("date2 : " + date2); ZonedDateTime zonedDateTime = localDateTime.atZone(defaultZoneId); Date date3 = Date.from(zonedDateTime.toInstant()); System.out.println("n3. ZonedDateTime -> Date"); System.out.println("zonedDateTime : " + zonedDateTime); System.out.println("date3 : " + date3); > >
System Default TimeZone : Asia/Kuala_Lumpur 1. LocalDate -> Date localDate : 2016-08-19 date : Fri Aug 19 00:00:00 MYT 2016 2. LocalDateTime -> Date localDateTime : 2016-08-19T21:46:31 date2 : Fri Aug 19 21:46:31 MYT 2016 3. ZonedDateTime -> Date zonedDateTime : 2016-08-19T21:46:31+08:00[Asia/Kuala_Lumpur] date3 : Fri Aug 19 21:46:31 MYT 2016
Рекомендации
- JSR 310: API даты и времени
- Unix time
- Мгновенный JavaDoc
- Дата JavaDoc
- Java — конвертировать дату и время между часовыми поясами