ChatGPT解决这个技术问题 Extra ChatGPT

Convert java.time.LocalDate into java.util.Date type

I want to convert java.time.LocalDate into java.util.Date type. Because I want to set the date into JDateChooser. Or is there any date chooser that supports java.time dates?

LGoodDatePicker natively uses the java.time package (aka Java 8 time, or JSR-310. Specifically, LGoodDatePicker uses a "java.time.LocalDate" to store the date values. Screenshots and a demo are at the Project Homepage.

J
JB Nizet
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

That assumes your date chooser uses the system default timezone to transform dates into strings.


I do not know why but using this conversion I get wrong results for dates before April 1893
Is it possible to avoid atStartOfDay(), since it changes the value of the date, as I understand it.
@JBNizet your answer doesn't make much sense to me that's why I decided to clarify. Why don't you clarify it instead of making useless comments?
Because I don't see how and why it would need any clarification. 232 people upvoted this answer, thus finding it clear. You say atStartOfDay changes the value of the date. That doesn't make sense. atStartOfDay does what the javadoc says it does: it transforms a LocalDate into a LocalDateTime, on the same date, and at the start of the day.
@cornz Are you sure your results are incorrect? If you're in Germany, then it might be something to do with the 6 minute 32 second glitch in the time in Germany, in April 1893. See timeanddate.com/time/zone/germany/berlin?syear=1850 for some details.
N
Nicholas DiPiazza

Here's a utility class I use to convert the newer java.time classes to java.util.Date objects and vice versa:

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

public class DateUtils {

  public static Date asDate(LocalDate localDate) {
    return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
  }

  public static Date asDate(LocalDateTime localDateTime) {
    return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
  }

  public static LocalDate asLocalDate(Date date) {
    return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate();
  }

  public static LocalDateTime asLocalDateTime(Date date) {
    return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime();
  }
}

Edited based on @Oliv comment.


Isn't using ZoneId.systemDefault() problematic because timezones change over the corse of the year. So if on 01-Jan I'm in timezone -05:00 (central), but then on 01-July I'm in the timezone -06:00 (central daylight) won't that cause inaccurate results because of daylight savings time?
G
George

Disclaimer: For illustrating existing java apis only. Should not be used in production code.

You can use java.sql.Date.valueOf() method as:

Date date = java.sql.Date.valueOf(localDate);

No need to add time and time zone info here because they are taken implicitly.
See LocalDate to java.util.Date and vice versa simplest conversion?


java.sql.Date is meant for the database layer, JDBC, JPA. The web layer (or any client application) should absolutely be free of any dependency from java.sql.*.
@Tiny java.sql.Date resides in rt.jar. There are no any external dependencies. You just use language features.
java.sql.Date is just java.util.Date with its time set to 00:00:00 but the point in design perspective is that java.sql.* is not meant for a front layer which clients interact with like Servlets / JSP. java.util.Date in Java side and java.sql.Timestamp or whatever applicable from java.sql.* in JDBC side.
This is a "horrible hack" according with the java.time.* author: stackoverflow.com/questions/33066904/…. In Java 9 java.sql.* classes will be a separate dependency.
If it is horrible hack why does not java include this simple stuff in java.util.. Day by day java is getting crazier than b4
K
Kevin Sadler

java.time has the Temporal interface which you can use to create Instant objects from most of the the time classes. Instant represents milliseconds on the timeline in the Epoch - the base reference for all other dates and times.

We need to convert the Date into a ZonedDateTime, with a Time and a Zone, to do the conversion:

LocalDate ldate = ...;
Instant instant = Instant.from(ldate.atStartOfDay(ZoneId.of("GMT")));
Date date = Date.from(instant);

c
ceklock

This works for me:

java.util.Date d = new SimpleDateFormat("yyyy-MM-dd").parse(localDate.toString());

https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#toString--


this is quite inefficient
Converting to Instant might be verbose, but building and parsing a String is like going from New York to Mexico City via Tokyo...
@ehecatl Beware... in the future NY -> Tokyo -> Mexico City may be done within hour(s) ;)
this works better for my use cases when I no longer have the timezone info at the time of conversion. E.g. work with Freemaker to print the date.
J
Jayendran

In order to create a java.util.Date from a java.time.LocalDate, you have to

add a time to the LocalDate

interpret the date and time within a time zone

get the number of seconds / milliseconds since epoch

create a java.util.Date

The code might look as follows:

LocalDate localDate = LocalDate.now();
Date date = new Date(localDate.atStartOfDay(ZoneId.of("America/New_York")).toEpochSecond() * 1000);

Typo in zone id (ZoneIf)
localDate.atStartOfDay() creates a ZonedDateTime, but there is no toEpochSecond() method for ZonedDateTime.
@KevinSadler: The method toEpochSecond is inherited from java.time.chrono.ChronoZonedDateTime. See docs.oracle.com/javase/8/docs/api/java/time/chrono/…
@nosid Thank you for your correction. When I use code completion in Eclipse it (and toInstance) isn't present as an option. But if I type it in full it seems to be accepted. I had wrongly concluded it wasn't a method because of this fact and that I didn't see it on the Javadoc for ZonedDateTime, as it is listed as an inherited method, as you say. Sorry, please accept an upclick :)
g
gyoder

Kotlin Solution:

1) Paste this extension function somewhere.

fun LocalDate.toDate(): Date = Date.from(this.atStartOfDay(ZoneId.systemDefault()).toInstant())

2) Use it, and never google this again.

val myDate = myLocalDate.toDate()

How is "switch to Kotlin" simple? This is a Java question.
Converting the Java LocalDate to Date is a common, annoying problem for any JVM developer. This is a solution for Kotlin developers.
Thanks! i was seeking for Kotlin solution.
W
William Nguyen
public static Date convertToTimeZone(Date date, String tzFrom, String tzTo) {
    return Date.from(LocalDateTime.ofInstant(date.toInstant(), ZoneId.of(tzTo)).atZone(ZoneId.of(tzFrom)).toInstant());
} 

Please explain your solution.
r
redd77
    LocalDate date = LocalDate.now();
    DateFormat formatter = new SimpleDateFormat("dd-mm-yyyy");
    try {
        Date utilDate= formatter.parse(date.toString());
    } catch (ParseException e) {
        // handle exception
    }

A
Aza
localDate.format(DateTimeFormatter.ofPattern("dd/MM/yyyy"));

Your answer could be improved by adding additional information on what the code does and how it helps the OP.
The question is how to convert from LocalDate to Date, not to String.
N
Nicolay

Try this:

public Date convertFrom(LocalDate date) {
    return Date.valueOf(date);
}

The valueOf method is a member of java.sql.Date, and the question specifies java.util.Date.
A
Artur Luiz Oliveira

Simple

public Date convertFrom(LocalDate date) {
    return java.sql.Timestamp.valueOf(date.atStartOfDay());
}

M
Mahendra Sri Dayarathna
java.util.Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());

how your answer is different from accepted one after 4 years? Copy-paste to achieve reputation increase?