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
Date 期间内两个分区日期时间之间的差异_Date_Java 8_Java Time_Period - Fatal编程技术网

Date 期间内两个分区日期时间之间的差异

Date 期间内两个分区日期时间之间的差异,date,java-8,java-time,period,Date,Java 8,Java Time,Period,使用LocalDate,我得到了在Period实例中表示的差异。例如: LocalDate born = LocalDate.of(1990, Month.SEPTEMBER, 30); Period myAge = Period.between(born, LocalDate.now()); System.out.println("My age is: "+myAge.getYears()+" years "+myAge.getMonths()+" months "+myAge.getDays

使用LocalDate,我得到了在Period实例中表示的差异。例如:

LocalDate born = LocalDate.of(1990, Month.SEPTEMBER, 30);
Period myAge = Period.between(born, LocalDate.now());
System.out.println("My age is: "+myAge.getYears()+" years "+myAge.getMonths()+" months "+myAge.getDays()+" days.");
ZonedDateTime now = ZonedDateTime.now(); // US/Pacific

LocalDate date = LocalDate.of(1990, Month.SEPTEMBER, 30);
LocalTime time = LocalTime.of(23, 55);
ZoneId zone = ZoneId.of("Australia/Melbourne");
ZonedDateTime born = ZonedDateTime.of(date, time, zone);
输出:

我的年龄是:26岁6个月23天

所以,我用period来计算年龄,以年、月、日为单位

我想使用两个时区(美国/太平洋和澳大利亚/墨尔本)对ZoneDateTime进行同样的操作。例如:

LocalDate born = LocalDate.of(1990, Month.SEPTEMBER, 30);
Period myAge = Period.between(born, LocalDate.now());
System.out.println("My age is: "+myAge.getYears()+" years "+myAge.getMonths()+" months "+myAge.getDays()+" days.");
ZonedDateTime now = ZonedDateTime.now(); // US/Pacific

LocalDate date = LocalDate.of(1990, Month.SEPTEMBER, 30);
LocalTime time = LocalTime.of(23, 55);
ZoneId zone = ZoneId.of("Australia/Melbourne");
ZonedDateTime born = ZonedDateTime.of(date, time, zone);
我希望获得与LocalDate相同的输出。我该怎么办?这有意义吗

预期产出:

我的年龄是:26岁6个月24天

文档的第一行说明它是ISO-8601格式的基于日期的时间量。它不打算与XXXTime一起使用

但是,请提供一种方法,该方法将返回给定的编号,直到另一个编号为止(
now

例如:

born.until(now, ChronoUnit.YEARS);
long years = born.until(now, ChronoUnit.YEARS);
born = born.plusYears(years);

long months = born.until(now, ChronoUnit.MONTHS);
born = born.plusMonths(months);

long days = born.until(now, ChronoUnit.DAYS);
他将于26日返回

一个技巧是将检索到的差异添加到开始日期,然后处理下一个
ChronoUnit

例如:

born.until(now, ChronoUnit.YEARS);
long years = born.until(now, ChronoUnit.YEARS);
born = born.plusYears(years);

long months = born.until(now, ChronoUnit.MONTHS);
born = born.plusMonths(months);

long days = born.until(now, ChronoUnit.DAYS);

然后您可以打印变量。

我建议将
LocalDate
ZoneId
存储在单独的字段/列中,而不是使用
ZonedDateTime
作为出生日期

从两个
LocalDate
实例中获取
Period
的简单方法是对这两个实例调用
toLocalDate()
。正如您所意识到的,存在一个问题,即那些
ZonedDateTime
实例可能位于不同的时区,这可能需要进行规范化工作。但是,我要再次强调,对于这些数据来说,更好的存储方式是两个字段-
LocalDate
和一个
ZoneId

Period p = Period.between(born.toLocalDate(), now.toLocalDate());
// warning! the above ignores time-zones, assuming both are the same
如果在
期间
加上
持续时间
(剩余的秒数)中需要两者之间的差异,可以使用以下方法:

Period p = Period.between(born.toLocalDate(), now.toLocalDate());
Duration d = Duration.between(born.with(now.toLocalDate()), now);

最后一个选择是使用。即将发布的v1.1将包含一个类
PeriodDuration
,它结合了
Period
Duration
,并允许存储两个
LocalDateTime
实例之间的时间量。

使用
LocalDate
表示生日的主要原因是每个人都以同样的方式庆祝自己的生日,或者换一种方式,每个人都根据自己当前所在的位置使用时钟来庆祝自己的生日。如果你出生在法国,现在生活在美国,而美国的时区偏移不同,你就不会通过观察法国的当前日期来庆祝你的生日,而是检查你当前所在的日期,这是你的本地日期。具有时区支持的时态类应用于跨区域的事件,例如,航班到达和起飞跟踪软件。因此,使用
ZonedDateTime
来描述生日并没有错,它在语义上是不正确的


另外,
Period
实现了
TemporalAmount
,它显然代表了一个时间跨度。所以用它来表示生日(再一次)并没有错,但它会让你的意图变得不那么清晰。生日是时间线上的一个确切时刻,而不是持续时间,因此总而言之,
LocalDate
是最佳选择

问题是你需要决定将小时四舍五入到天,以及在哪个时区计算;由于DST规则不同,两个区域中的计数可能不一致。@JodaStephen这就是为什么我在检查后立即用plusYears和plusMonths重新分配born变量的原因。