Convert java.time.LocalDate into java.util.Date type
Asked Answered
E

13

464

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?

Eliaseliason answered 8/4, 2014 at 6:29 Comment(3)
Have you read #21242610 ?Fiddlestick
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.Ischia
More answers can be found on: LocalDate to java.util.Date and vice versa simplest conversion?Imtiaz
T
680
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

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

Theressa answered 8/4, 2014 at 6:39 Comment(7)
I do not know why but using this conversion I get wrong results for dates before April 1893Embower
Is it possible to avoid atStartOfDay(), since it changes the value of the date, as I understand it.Jointure
@Jointure your comment doesn't make much sense to me. Why don't you ask your own question instead of commenting on a very old one?Theressa
@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?Jointure
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.Theressa
@Embower 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.Anthropometry
This jsut works on android "O" and above. Iwant this method to get rid of LocalDate that can not support in my app, so this method is bring me same issue.Liston
U
140

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.

Upchurch answered 5/12, 2014 at 19:34 Comment(1)
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?Edo
C
112

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?

Coy answered 17/2, 2015 at 14:46 Comment(8)
This was perfect for me, since what I needed was to pass LocalDate into SQL. However, if your Date formatter is going to do something about time zone shift before formatting the date, you might get one day too early depending on the local time zone, in which case you'll want one of the above options instead.Norvall
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.*.Kalagher
@Kalagher java.sql.Date resides in rt.jar. There are no any external dependencies. You just use language features.Coy
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.Kalagher
This is a "horrible hack" according with the java.time.* author: #33067404. In Java 9 java.sql.* classes will be a separate dependency.Mesentery
Attention! This is NOT providing you with java.util.DateRosewood
If it is horrible hack why does not java include this simple stuff in java.util.. Day by day java is getting crazier than b4Surely
I do actually like this hack, and e.g. baudelang is mentioning there as well, without any issues or comments, that it may be problematic (hack). Check yourself: baeldung.com/…Louise
F
20

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);
Foreclosure answered 2/12, 2014 at 10:48 Comment(0)
S
14

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);
Selfimprovement answered 8/4, 2014 at 6:40 Comment(4)
Typo in zone id (ZoneIf)Yaron
localDate.atStartOfDay() creates a ZonedDateTime, but there is no toEpochSecond() method for ZonedDateTime.Foreclosure
@KevinSadler: The method toEpochSecond is inherited from java.time.chrono.ChronoZonedDateTime. See docs.oracle.com/javase/8/docs/api/java/time/chrono/…Selfimprovement
@Selfimprovement 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 :)Foreclosure
B
14

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--

Bamby answered 21/3, 2015 at 21:3 Comment(6)
this is quite inefficientTournai
Converting to Instant might be verbose, but building and parsing a String is like going from New York to Mexico City via Tokyo...Phalansterian
@Phalansterian Beware... in the future NY -> Tokyo -> Mexico City may be done within hour(s) ;)Preoccupancy
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.Kimon
this is wrong solution because SimpleDateFormat is not thread safeMagritte
@OlegUshakov if it's inlined like this, then thread-safety will not failCarlcarla
S
12

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()
Stun answered 11/4, 2018 at 15:4 Comment(3)
How is "switch to Kotlin" simple? This is a Java question.Phalansterian
Converting the Java LocalDate to Date is a common, annoying problem for any JVM developer. This is a solution for Kotlin developers.Stun
Thanks! i was seeking for Kotlin solution.Emlin
C
-1
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());
} 
Clementineclementis answered 17/2, 2016 at 10:13 Comment(1)
Please explain your solution.Skin
G
-1
    LocalDate date = LocalDate.now();
    DateFormat formatter = new SimpleDateFormat("dd-mm-yyyy");
    try {
        Date utilDate= formatter.parse(date.toString());
    } catch (ParseException e) {
        // handle exception
    }
Grekin answered 25/11, 2020 at 13:16 Comment(0)
F
-2

Try this:

public Date convertFrom(LocalDate date) {
    return Date.valueOf(date);
}
Fluvial answered 2/6, 2022 at 10:59 Comment(1)
The valueOf method is a member of java.sql.Date, and the question specifies java.util.Date.Macrophysics
H
-3

Simple

public Date convertFrom(LocalDate date) {
    return java.sql.Timestamp.valueOf(date.atStartOfDay());
}
Haroun answered 15/3, 2016 at 2:58 Comment(0)
V
-3
localDate.format(DateTimeFormatter.ofPattern("dd/MM/yyyy"));
Vories answered 2/2, 2022 at 10:24 Comment(2)
Your answer could be improved by adding additional information on what the code does and how it helps the OP.Oversubscribe
The question is how to convert from LocalDate to Date, not to String.Macrophysics
T
-6
java.util.Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
Tedie answered 18/10, 2018 at 6:40 Comment(1)
how your answer is different from accepted one after 4 years? Copy-paste to achieve reputation increase?Merl

© 2022 - 2024 — McMap. All rights reserved.