如何将java.util.Date转换为java.time.LocalDate并保留日期/时间

如何将java.util.Date转换为java.time.LocalDate并保留日期/时间,java,java-time,localdate,java.util.date,Java,Java Time,Localdate,Java.util.date,我正在尝试将java.util.Date转换为java.time.LocalDate: [java.util.Date instance].toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); 但是,有一种情况是,[java.util.Date instance]的日时间为,例如:22:25,我选择这样的ZoneId,例如:ZoneId.of(“亚洲/新加坡”) 即将推出的LocalDate将有不同的日期(因为该区域增加+6小时),

我正在尝试将
java.util.Date
转换为
java.time.LocalDate

[java.util.Date instance].toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
但是,有一种情况是,
[java.util.Date instance]
的日时间为,例如:22:25,我选择这样的ZoneId,例如:
ZoneId.of(“亚洲/新加坡”)

即将推出的
LocalDate
将有不同的日期(因为该区域增加+6小时),例如欧洲/明斯克:

printing java.util.Date: Thu Mar 04 22:25:00 CET 2021
printing converted java.util.Date to java.time.LocalDate with Europe/Minsk: 2021-03-04
printing converted java.util.Date to java.time.LocalDate with Asia/Singapore: 2021-03-05

我想在生成的
LocalDate
中保留与该
date
实例相同的日期。如何解决这个问题?我想可能有几种方法。

您可以简单地将
Date
的值复制到
LocalDate
,而无需转换数据:

LocalDate.of(date.getYear(), date.getMonth()+1, date.getDate());

您只需将
Date
的值复制到
LocalDate
即可,无需转换数据:

LocalDate.of(date.getYear(), date.getMonth()+1, date.getDate());

Instant
始终以
UTC
为单位提供日期时间,如果希望保持相同的日期,则需要使用
UTC
的区域偏移量

演示:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.util.Date;
import java.util.Locale;

public class Main {
    public static void main(String[] args) throws ParseException {
        String strDateTime = "10/02/2021 22:25";
        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm", Locale.ENGLISH);
        Date date = sdf.parse(strDateTime);
        Instant instant = date.toInstant();
        ZonedDateTime zdt = instant.atZone(ZoneOffset.UTC);
        LocalDate localDate = zdt.toLocalDate();
        System.out.println(localDate);
    }
}
2021-10-02
输出:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.util.Date;
import java.util.Locale;

public class Main {
    public static void main(String[] args) throws ParseException {
        String strDateTime = "10/02/2021 22:25";
        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm", Locale.ENGLISH);
        Date date = sdf.parse(strDateTime);
        Instant instant = date.toInstant();
        ZonedDateTime zdt = instant.atZone(ZoneOffset.UTC);
        LocalDate localDate = zdt.toLocalDate();
        System.out.println(localDate);
    }
}
2021-10-02
了解有关现代日期时间API的更多信息


java.util
date-time API及其格式化API
SimpleDataFormat
已经过时,并且容易出错。建议完全停止使用,并切换到。无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用哪个backport将大部分Java.time功能移植到Java6&7。如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并确认。
Instant
始终以
UTC
为单位提供日期时间,如果要保持相同的日期,则需要使用
UTC
的区域偏移量

演示:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.util.Date;
import java.util.Locale;

public class Main {
    public static void main(String[] args) throws ParseException {
        String strDateTime = "10/02/2021 22:25";
        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm", Locale.ENGLISH);
        Date date = sdf.parse(strDateTime);
        Instant instant = date.toInstant();
        ZonedDateTime zdt = instant.atZone(ZoneOffset.UTC);
        LocalDate localDate = zdt.toLocalDate();
        System.out.println(localDate);
    }
}
2021-10-02
输出:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.util.Date;
import java.util.Locale;

public class Main {
    public static void main(String[] args) throws ParseException {
        String strDateTime = "10/02/2021 22:25";
        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm", Locale.ENGLISH);
        Date date = sdf.parse(strDateTime);
        Instant instant = date.toInstant();
        ZonedDateTime zdt = instant.atZone(ZoneOffset.UTC);
        LocalDate localDate = zdt.toLocalDate();
        System.out.println(localDate);
    }
}
2021-10-02
了解有关现代日期时间API的更多信息


java.util
date-time API及其格式化API
SimpleDataFormat
已经过时,并且容易出错。建议完全停止使用,并切换到。无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用哪个backport将大部分Java.time功能移植到Java6&7。如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查并确认。

您可以将其转换为即时,将时区设置为UTC,因为它使用UTC

public static LocalDate convert (Date date) {
    return date.toInstant()
      .atZone(ZoneId.of("UTC"))
      .toLocalDate();
}

您可以将其转换为即时,将时区设置为UTC,因为它正在使用UTC

public static LocalDate convert (Date date) {
    return date.toInstant()
      .atZone(ZoneId.of("UTC"))
      .toLocalDate();
}

对不起,你问的是不可能的事。尽管名称是过时的
Date
类,但它并不表示日期。它代表一个时间点。届时,新加坡和明斯克很可能会有两个不同的日期。因为你从一开始就没有日期,所以没有保留同一日期的事情。

对不起,你问的是不可能的事。尽管名称是过时的
Date
类,但它并不表示日期。它代表一个时间点。届时,新加坡和明斯克很可能会有两个不同的日期。因为从一开始就没有日期,所以没有保留相同日期的事情。

你更快了。没错,
ZoneId.systemDefault()
是特定于位置的,因此
ZoneOffset.UTC
是理解
LocalDate
的好选择,无论我们位于何处。您更快了。没错,
ZoneId.systemDefault()
是特定于位置的,因此
ZoneOffset.UTC
是理解
LocalDate
的好选择,无论我们位于何处。
getXxx
日期方法已经被弃用了24年。理由很充分:它们跨时区工作不可靠。不要这样做。日期的
getXxx
方法已经被弃用了24年。理由很充分:它们跨时区工作不可靠。不要这样做。如果你认为我的问题问错了,请提出一个修改。我认为这个问题就目前的情况而言是好的。认为可以从
日期
中获得明确的日期是一个常见的错误。因此,你的问题和我的回答可以帮助未来的读者澄清事实并非如此。如果你认为我的问题问错了,请提出一个编辑。我认为这个问题就目前而言是好的。认为可以从
日期
中获得明确的日期是一个常见的错误。所以你的问题和我的回答可以帮助未来的读者澄清事实并非如此。