如何将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及其格式化APISimpleDataFormat
已经过时,并且容易出错。建议完全停止使用,并切换到。无论出于何种原因,如果您必须坚持使用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及其格式化APISimpleDataFormat
已经过时,并且容易出错。建议完全停止使用,并切换到。无论出于何种原因,如果您必须坚持使用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年。理由很充分:它们跨时区工作不可靠。不要这样做。如果你认为我的问题问错了,请提出一个修改。我认为这个问题就目前的情况而言是好的。认为可以从日期
中获得明确的日期是一个常见的错误。因此,你的问题和我的回答可以帮助未来的读者澄清事实并非如此。如果你认为我的问题问错了,请提出一个编辑。我认为这个问题就目前而言是好的。认为可以从日期
中获得明确的日期是一个常见的错误。所以你的问题和我的回答可以帮助未来的读者澄清事实并非如此。