- How to convert Date to LocalDate and LocalDateTime in Java 8 — Example Tutorial
- Steps to convert java.util.Date to java.time.LocalDate in Java
- Java Program to convert java.util.Date to java.time.LocalDate
- Преобразование даты в LocalDate или LocalDateTime и обратно
- 2. Преобразование java.util.Date в java.time.LocalDate
- 3. Преобразование java.util.Date в java.time.LocalDateTime
- 4. Преобразование java.time.LocalDate в java.util.Date
- 5. Преобразование java.time.LocalDateTime в java.util.Date
- 6. Дополнения для Java 9
- 7. Заключение
How to convert Date to LocalDate and LocalDateTime in Java 8 — Example Tutorial
The easiest way to convert a java.util.Date to java.time.LocalDate is via Instant, which is the equivalent class of java.util.Date in JDK 8. You can first convert util Date to Instant and then create a LocalDateTime object from that instant at your default timezone. Once you have an instant of LocalDateTime, you can easily convert that to LocalDate or LocalTime in Java. If you are not living under the rock in the last two years that its 2016 and Java 8 has been around for more than 2 years, 18th March 2014 Java SE 8 GA happened.
In the third attempt of designing a robust date and time API, JDK 8 has come up with JSR 318 new Date and Time API, and many programmers have already started using it.
The new API is meant to replace our old but not so gold, but still ubiquitous java.util.Date and Calendar API, but unfortunately conversion between java.util.Date to java.time.LocalDate, java.time.LocalTime is not that straightforward.
You need to cross a couple of bridges to reach there. This is the start of the Java 8 conversion tutorial series where I’ll share lots of tutorials about converting old date classes to the new date and time classes in Java 8.
Btw, if you are not familiar with the new Date and Time API added on Java 8 then I suggest you first go through a comprehensive and up-to-date Java course like The Complete Java MasterClass on Udemy. It’s also very affordable and you can buy in just $10 on Udemy sales which happen every now and then.
Steps to convert java.util.Date to java.time.LocalDate in Java
- Convert java.util.Date to java.time.Instant class
- Convert java.time.Instant to java.time.LocalDateTime using System’s default timezone.
- Convert java.time.LocalDateTime to java.time.LocalDate in Java
Just like old classes were a millisecond value from Epoch, Instant is also an instant in time scale but it doesn’t care about time zone but LocalDatetime class uses local Timezone.
That’s why when you convert an Instant to LocalDateTime, it needed a timezone. The LocalDateTime class has both date and time components, so if you just need the date part, you can use the toLocalDate() method to convert LocalDatetTime to LocalDate as shown in the following example.
You can also see these Java 8 tutorials and courses to learn more bout the Date and time API in Java 8 and beyond.
Java Program to convert java.util.Date to java.time.LocalDate
Here is our Java program to convert the java.util.Date to new java.time.LocalDate in Java 8.
package test; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.Date; /** * Java Program to convert java.util.Date to java.time.LocalDate in JDK8 */ public class Test < public static void main(String[] args) < // converting java.util.Date to java.time.LocalDate Date today = new Date(); Instant instant = Instant.ofEpochMilli(today.getTime()); LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); LocalDate localDate = localDateTime.toLocalDate(); System.out.println("java.util.Date: " + today); System.out.println("java.time.LocalDate: " + localDate); > > Output java.util.Date: Thu Jun 09 15:02:16 PDT 2016 java.time.LocalDate: 2016-06-09
That’s all about how to convert Date to LocalDate in Java. You can see that both java.util.Date and java.time.LocalDate has the same value. In the next article, we’ll take a look at the opposite of this i.e. will convert the new date class to the old date class in Java 8. Please see Java SE 8 for the Really Impatient book by Cay S. Horstmann to learn more new Date and Time API of Java 8 in a quick time.
- 20 Essential Examples of Date and Time API of Java 8? (tutorial)
- How to compare two dates in Java? (tutorial)
- How to parse String to LocalDateTime in Java 8? (tutorial)
- How to convert Date to LocalDateTime in Java 8? (tutorial)
- How to get the current Timestamp value in Java? (tutorial)
- How to convert String to LocalDateTime in Java 8? (example)
- How to parse String to Date using JodaTime library? (example)
- How to get the current date and time in Java 6? (tutorial)
- How to convert java.util.Date to java.sql.Date in JDBC? (tutorial)
- How to convert java.util.Date to java.sql.Timestamp in JDBC? (tutorial)
Преобразование даты в LocalDate или LocalDateTime и обратно
Начиная с Java 8, у нас есть новый API Date: java.time .
Однако иногда нам по-прежнему необходимо выполнять преобразования между новым и старым API и работать с представлениями даты из обоих.
2. Преобразование java.util.Date в java.time.LocalDate
Начнем с преобразования старого представления даты в новое.
Здесь мы можем воспользоваться новым методом toInstant() , который был добавлен в java.util.Date в Java 8.
Когда мы преобразовываем объект Instant , необходимо использовать ZoneId , потому что объекты Instant не зависят от часового пояса — просто точки на временной шкале.
API atZone(ZoneId zone) из объекта Instant возвращает ZonedDateTime , поэтому нам просто нужно извлечь из него LocalDate с помощью метода toLocalDate() .
Во-первых, мы используем системный ZoneId по умолчанию :
public LocalDate convertToLocalDateViaInstant(Date dateToConvert) return dateToConvert.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate(); >
И похожее решение, но с другим способом создания объекта Instant — с использованием метода ofEpochMilli() :
public LocalDate convertToLocalDateViaMilisecond(Date dateToConvert) return Instant.ofEpochMilli(dateToConvert.getTime()) .atZone(ZoneId.systemDefault()) .toLocalDate(); >
Прежде чем двигаться дальше, давайте также кратко рассмотрим старый класс java.sql.Date и то, как его можно также преобразовать в LocalDate .
Начиная с Java 8, мы можем найти дополнительный метод toLocalDate () для java.sql.Date , который также дает нам простой способ преобразования его в java.time.LocalDate .
В этом случае нам не нужно беспокоиться о часовом поясе:
public LocalDate convertToLocalDateViaSqlDate(Date dateToConvert) return new java.sql.Date(dateToConvert.getTime()).toLocalDate(); >
Точно так же мы можем преобразовать старый объект Date в объект LocalDateTime . Давайте посмотрим на это дальше.
3. Преобразование java.util.Date в java.time.LocalDateTime
Чтобы получить экземпляр LocalDateTime , мы можем аналогичным образом использовать посредник ZonedDateTime, а затем использовать API toLocalDateTime() .
Как и раньше, мы можем использовать два возможных решения для получения объекта Instant из java.util.Date :
public LocalDateTime convertToLocalDateTimeViaInstant(Date dateToConvert) return dateToConvert.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDateTime(); > public LocalDateTime convertToLocalDateTimeViaMilisecond(Date dateToConvert) return Instant.ofEpochMilli(dateToConvert.getTime()) .atZone(ZoneId.systemDefault()) .toLocalDateTime(); >
Обратите внимание, что для дат до 10 октября 1582 года необходимо настроить Calendar как григорианский календарь и вызвать метод setGregorianChange ():
GregorianCalendar calendar = new GregorianCalendar(); calendar.setGregorianChange(new Date(Long.MIN_VALUE)); Date dateToConvert = calendar.getTime();
И, начиная с Java 8, мы также можем использовать java.sql.Timestamp для получения LocalDateTime :
ocalDateTime convertToLocalDateTimeViaSqlTimestamp(Date dateToConvert) return new java.sql.Timestamp( dateToConvert.getTime()).toLocalDateTime(); >
4. Преобразование java.time.LocalDate в java.util.Date
Теперь, когда мы хорошо понимаем, как преобразовать старое представление данных в новое, давайте посмотрим на преобразование в другом направлении.
Мы обсудим два возможных способа преобразования LocalDate в Date .
В первом мы используем новый метод valueOf(LocalDate date) , предоставленный в объекте java.sql.Date , который принимает LocalDate в качестве параметра:
public Date convertToDateViaSqlDate(LocalDate dateToConvert) return java.sql.Date.valueOf(dateToConvert); >
Как мы видим, это легко и интуитивно понятно. Он использует местный часовой пояс для преобразования (все делается скрыто, так что не о чем беспокоиться).
В другом примере Java 8 мы используем объект Instant , который мы передаем в метод from (Instant Instant) объекта java.util.Date : **** «
public Date convertToDateViaInstant(LocalDate dateToConvert) return java.util.Date.from(dateToConvert.atStartOfDay() .atZone(ZoneId.systemDefault()) .toInstant()); >
Обратите внимание, что здесь мы используем объект Instant и что нам также нужно позаботиться о часовых поясах при выполнении этого преобразования.
Далее воспользуемся очень похожим решением для преобразования LocalDateTime в объект Date .
5. Преобразование java.time.LocalDateTime в java.util.Date
Самый простой способ получить java.util.Date из LocalDateTime — использовать расширение для java.sql.Timestamp, доступное в Java 8:
public Date convertToDateViaSqlTimestamp(LocalDateTime dateToConvert) return java.sql.Timestamp.valueOf(dateToConvert); >
Но, конечно, альтернативным решением является использование объекта Instant , который мы получаем из ZonedDateTime :
Date convertToDateViaInstant(LocalDateTime dateToConvert) return java.util.Date .from(dateToConvert.atZone(ZoneId.systemDefault()) .toInstant()); >
6. Дополнения для Java 9
В Java 9 доступны новые методы, упрощающие преобразование между java.util.Date и java.time.LocalDate или java.time.LocalDateTime .
LocalDate.ofInstant(Instant Instant, ZoneId zone) и LocalDateTime.ofInstant(Instant Instant, ZoneId zone) предоставляют удобные ярлыки:
public LocalDate convertToLocalDate(Date dateToConvert) return LocalDate.ofInstant( dateToConvert.toInstant(), ZoneId.systemDefault()); > public LocalDateTime convertToLocalDateTime(Date dateToConvert) return LocalDateTime.ofInstant( dateToConvert.toInstant(), ZoneId.systemDefault()); >
7. Заключение
В этой статье мы рассмотрели возможные способы преобразования старого java.util.Date в новые java.time.LocalDate и java.time.LocalDateTime , а также наоборот.
Полная реализация этой статьи доступна на GitHub .