Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';在Java8中,从Date迁移到LocalDate的正确方法是什么?_Java_Date_Java Time - Fatal编程技术网

什么';在Java8中,从Date迁移到LocalDate的正确方法是什么?

什么';在Java8中,从Date迁移到LocalDate的正确方法是什么?,java,date,java-time,Java,Date,Java Time,我目前正在开发一个遗留代码库,其中Date到处都使用,并且继续使用,因为Dates到处都是(实体包含Dates,服务期望Dates等)。对于不应使用时间部分的某些情况,我们基本上通过在实用程序方法中使用以下标准片段,将其从Date对象中删除 final Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); ca

我目前正在开发一个遗留代码库,其中
Date
到处都使用,并且继续使用,因为
Date
s到处都是(实体包含
Date
s,服务期望
Date
s等)。对于不应使用时间部分的某些情况,我们基本上通过在实用程序方法中使用以下标准片段,将其从
Date
对象中删除

final Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
对于这些情况,我想开始使用
LocalDate
。据我所知,推荐的标准转换方法是(至少在Java 8中):

我有点不安的是
atZone(ZoneId.systemDefault())
部分。根据执行代码的系统,是否可以获得不同的
LocalDate
s?我想我可以从
Date
中提取年、月和日,并通过显式地传递年、月和日来构造一个新的
LocalDate
,但如果我能确保语义得到维护,我想使用标准解决方案(即,我不会因为一天的错误而得到任何回报)。我首先尝试:

date.toInstant().atOffset(ZoneOffset.UTC).toLocalDate()
但这确实给出了一个实例,其中
Date
LocalDate
在1天内关闭


感谢任何指点

“根据执行代码的系统,我可以获得不同的LocalDate吗?”可以,但您的
日历
代码也可以。如果您使用的是
Calendar.getInstance()
(采用默认时区和语言环境),则使用
atZone(ZoneId.systemDefault())时不会有更大的风险
?我认为您可能需要调整您的期望。
日期
表示时间上的一个瞬间(从纪元开始n毫秒)。您正在尝试将所有的时、分、秒组件设置为0。但“小时和分钟组成部分”在“时间瞬间”的上下文中没有意义。如果你给它添加一个区域,它们就有意义了<代码>日历
,设计不当,会对您隐藏这些详细信息,并静默使用系统时区。另一方面,java.time要求您提供一个时区,使您意识到这本质上是与时区相关的。因此,从@Sweeper和@TacheDeChoco的评论来看,我是否可以假设使用
atZone(ZoneId.systemDefault())
将始终产生与前面使用
Calendar.getInstance()的代码相同的结果
因为它使用的是
时区.getDefault()
区域设置.getDefault(Category)
在引擎盖下?@contiver我不认为它们是相同的结果。
日历
代码生成一个
日期
,这在概念上是一个即时时间,而java.time代码生成一个
本地日期
,这在概念上是一个年-月-日元组。这是两个截然不同的概念。它们只有在系统时区中观察到的
日期
与java.time代码生成的
本地日期
具有相同的年、月、日的意义上是相同的。
date.toInstant().atOffset(ZoneOffset.UTC).toLocalDate()