如何将 java.util.Date 转换为 java.time.LocalDate 并保留 date/time

How to convert java.util.Date to java.time.LocalDate and preserve date/time

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

[java.util.Date instance].toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

但是,有一种情况 [java.util.Date instance] 的白天时间为:22:25,我选择的 ZoneId 例如:ZoneId.of("Asia/Singapore").

结果 LocalDate 将有不同的一天(因为该区域增加了 +6 小时),例如 Europe/Minsk:

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());

Instant 总是在 UTC 中给你日期时间,如果你想保持相同的日期,你需要使用 UTC.[=19= 的时区偏移量]

演示:

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

Trail: Date Time.

了解有关现代日期时间 API 的更多信息

java.util 日期时间 API 及其格式 API、SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到 modern date-time API. For any reason, if you have to stick to Java 6 or Java 7, you can use ThreeTen-Backport which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and

您可以将其转换为即时,将时区设置为 UTC,因为 java.util.Date 使用的是 UTC。

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

对不起,您问的是不可能的事情。尽管它的名字是过时的 Date class 并不代表日期。它代表一个时间点。在那个时间点,新加坡和明斯克很容易有两个不同的日期。没有保留相同日期这样的东西,因为你从一开始就没有日期。