如何将 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
了解有关现代日期时间 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 并不代表日期。它代表一个时间点。在那个时间点,新加坡和明斯克很容易有两个不同的日期。没有保留相同日期这样的东西,因为你从一开始就没有日期。
我正在尝试将 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
了解有关现代日期时间 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 并不代表日期。它代表一个时间点。在那个时间点,新加坡和明斯克很容易有两个不同的日期。没有保留相同日期这样的东西,因为你从一开始就没有日期。