Convert java.util.Date to java.time.LocalDate

前端 未结 13 2421
温柔的废话
温柔的废话 2020-11-22 08:45

What is the best way to convert a java.util.Date object to the new JDK 8/JSR-310 java.time.LocalDate?

Date input = new Date();
Loca         


        
相关标签:
13条回答
  • 2020-11-22 09:28

    Short answer

    Date input = new Date();
    LocalDate date = input.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
    

    Explanation

    Despite its name, java.util.Date represents an instant on the time-line, not a "date". The actual data stored within the object is a long count of milliseconds since 1970-01-01T00:00Z (midnight at the start of 1970 GMT/UTC).

    The equivalent class to java.util.Date in JSR-310 is Instant, thus there is a convenient method toInstant() to provide the conversion:

    Date input = new Date();
    Instant instant = input.toInstant();
    

    A java.util.Date instance has no concept of time-zone. This might seem strange if you call toString() on a java.util.Date, because the toString is relative to a time-zone. However that method actually uses Java's default time-zone on the fly to provide the string. The time-zone is not part of the actual state of java.util.Date.

    An Instant also does not contain any information about the time-zone. Thus, to convert from an Instant to a local date it is necessary to specify a time-zone. This might be the default zone - ZoneId.systemDefault() - or it might be a time-zone that your application controls, such as a time-zone from user preferences. Use the atZone() method to apply the time-zone:

    Date input = new Date();
    Instant instant = input.toInstant();
    ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
    

    A ZonedDateTime contains state consisting of the local date and time, time-zone and the offset from GMT/UTC. As such the date - LocalDate - can be easily extracted using toLocalDate():

    Date input = new Date();
    Instant instant = input.toInstant();
    ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
    LocalDate date = zdt.toLocalDate();
    

    Java 9 answer

    In Java SE 9, a new method has been added that slightly simplifies this task:

    Date input = new Date();
    LocalDate date = LocalDate.ofInstant(input.toInstant(), ZoneId.systemDefault());
    

    This new alternative is more direct, creating less garbage, and thus should perform better.

    0 讨论(0)
  • 2020-11-22 09:29

    If you are using ThreeTen Backport including ThreeTenABP

        Date input = new Date(); // Imagine your Date here
        LocalDate date = DateTimeUtils.toInstant(input)
                .atZone(ZoneId.systemDefault())
                .toLocalDate();
    

    If you are using the backport of JSR 310, either you haven’t got a Date.toInstant() method or it won’t give you the org.threeten.bp.Instant that you need for you further conversion. Instead you need to use the DateTimeUtils class that comes as part of the backport. The remainder of the conversion is the same, so so is the explanation.

    0 讨论(0)
  • 2020-11-22 09:30

    You can convert in one line :

    public static LocalDate getLocalDateFromDate(Date date){
       return LocalDate.from(Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()));
    }
    
    0 讨论(0)
  • 2020-11-22 09:30

    I solved this question with solution below

      import org.joda.time.LocalDate;
      Date myDate = new Date();
      LocalDate localDate = LocalDate.fromDateFields(myDate);
      System.out.println("My date using Date" Nov 18 11:23:33 BRST 2016);
      System.out.println("My date using joda.time LocalTime" 2016-11-18);
    

    In this case localDate print your date in this format "yyyy-MM-dd"

    0 讨论(0)
  • 2020-11-22 09:31

    I have had problems with @JodaStephen's implementation on JBoss EAP 6. So, I rewrote the conversion following Oracle's Java Tutorial in http://docs.oracle.com/javase/tutorial/datetime/iso/legacy.html.

        Date input = new Date();
        GregorianCalendar gregorianCalendar = (GregorianCalendar) Calendar.getInstance();
        gregorianCalendar.setTime(input);
        ZonedDateTime zonedDateTime = gregorianCalendar.toZonedDateTime();
        zonedDateTime.toLocalDate();
    
    0 讨论(0)
  • 2020-11-22 09:39
    LocalDate localDate = LocalDate.parse( new SimpleDateFormat("yyyy-MM-dd").format(date) );
    
    0 讨论(0)
提交回复
热议问题