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

时间:2021-03-05 10:30:59

标签: 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("Asia/Singapore")

结果 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 实例中相同的日期。一些方法如何解决这个问题?我想可能有几种方法。

4 个答案:

答案 0 :(得分:3)

this.files[0] 总是在 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);
    }
}

Trail: Date Time 了解有关现代日期时间 API 的更多信息。


2021-10-02 日期时间 API 及其格式化 API java.util 已过时且容易出错。建议完全停止使用它们并切换到 modern date-time API。出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7。如果您正在工作对于 Android 项目并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

相关问题