Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

transform java.sql.Date to LocalDateTime

Tags:

java

date

I have a java.sql.Date object and want to transform it to a java.time.LocalDateTime object.

For comparison, I am able to do a similar transformation using java.util.Date:

java.util.Date utilDate = new java.util.Date(sqlDate.getTime());
System.out.println("date with time: " + utilDate);

This answer doesn't work for me, as my java.sql.Date does not have a getTimestamp method.

For reference, this question addresses the opposite transformation.

like image 213
Woodchuck Avatar asked Jan 24 '26 06:01

Woodchuck


2 Answers

You are using terrible date-time classes that were years ago supplanted by the modern java.time classes defined in JSR 310.

  • Do not use java.sql.Date
  • Do not use java.util.Date
  • Do not use java.sql.Timestamp
  • Do not use java.util.Calendar

Use only java.time classes.

For exchanging date-time values with a database, use JDBC 4.2 or later.

The java.sql.Date class pretends to represent a date-only value.

If you are handed a java.sql.Date object, immediately convert it to a java.time.LocalDate. Use the new method toLocalDate added to that old class.

LocalDate localDate  = myJavaSqlDate.toLocalDate() ;

You asked for a java.time.LocalDateTime object. You have the necessary date portion. Now you need to assign the time-of-day portion.

LocalTime localTime = LocalTime.of( 15 , 30 );

Combine.

LocalDateTime localDateTime = LocalDateTime.of( localDate, localTime ) ;

A LocalDateTime is inherently ambiguous. 3:30 PM πŸ•ž in Japan πŸ‡―πŸ‡΅ is a different moment than 3:30 PM πŸ•ž in Morocco πŸ‡²πŸ‡¦.

To determine a moment, a specific point on the timeline, place your LocalDateTime within the context of a time zone. You get a ZonedDateTimeObject.

ZoneId zoneId = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zonedDateTime = localDateTime.atZone( zoneId ) ;

To view that moment as seen in UTC, with an offset from UTC of zero hours-minutes-seconds, extract an Instant.

Instant instant = zonedDateTime.toInstant() ;
like image 85
Basil Bourque Avatar answered Jan 25 '26 21:01

Basil Bourque


To answer your question as asked

There’s a wealth of good information in the clever answer by Basil Bourque. Not least the recommendation to avoid the java.sql.Date class completely so you won’t need the conversion.

For this answer I am assuming that you are getting a java.sql.Date from a legacy API that you can’t afford to upgrade to java.time just now. So you do need some conversion, and you have reasons to ask for a LocalDateTime representing the time in the default time zone of the JVM (a fragile practice). There is still a question to consider: do you want only the date part of the Date, or its point in time? Asking because a java.sql.Date was meant for representing a date without time of day, but the API does not enforce this, and a java.sql.Date holds a point in time with millisecond precision. I hope we already told you that this is a confusing class better to be avoided if you can.

To get the start of the day:

    java.sql.Date oldfashionedSqlDate
            = java.sql.Date.valueOf(LocalDate.of(2021, Month.OCTOBER, 26));
    System.out.println("java.sql.Date: " + oldfashionedSqlDate);
    LocalDateTime dateTime = oldfashionedSqlDate.toLocalDate().atStartOfDay();
    System.out.println("LocalDateTime: " + dateTime);

Output (assuming the default time zone of the JVM has not changed in the meantime):

java.sql.Date: 2021-10-26
LocalDateTime: 2021-10-26T00:00

To get the point in time: To pick up the full precision held in the Date object:

    java.sql.Date oldfashionedSqlDate = new java.sql.Date(1_666_000_000_000L);
    System.out.println("java.sql.Date: " + oldfashionedSqlDate);
    long epochMilli = oldfashionedSqlDate.getTime();
    LocalDateTime dateTime = Instant.ofEpochMilli(epochMilli)
            .atZone(ZoneId.systemDefault())
            .toLocalDateTime();
    System.out.println("LocalDateTime: " + dateTime);

Output in my time zone:

java.sql.Date: 2022-10-17
LocalDateTime: 2022-10-17T03:46:40

Since the conversion is time zone dependent, output in other time zones will differ in most cases.

like image 21
Ole V.V. Avatar answered Jan 25 '26 20:01

Ole V.V.



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!