我不确定自己是否掌握了Java中Period
和Duration
之间的微妙差别。
当我阅读Oracle的说明时,它说我可以像这样找出自生日以来的天数(使用他们使用的示例日期):
LocalDate today = LocalDate.now();
LocalDate birthday = LocalDate.of(1960, Month.JANUARY, 1);
Period birthdayPeriod = Period.between(birthday, today);
int daysOld = birthdayPeriod.getDays();
但是,即使他们指出这一点,这也没有考虑到你出生时所处的时区和现在所在的时区。但这是一台计算机,我们可以精确计算,对吗?那么我应该使用一个 Duration
吗?
ZoneId bornIn = ZoneId.of("America/New_York");
ZonedDateTime born = ZonedDateTime.of(1960, Month.JANUARY.getValue(), 1, 2, 34, 56, 0, bornIn);
ZonedDateTime now = ZonedDateTime.now();
Duration duration = Duration.between(born, now);
long daysPassed = duration.toDays();
现在实际时间是准确的,但如果我理解正确,天数可能不正确地表示日历天数,例如考虑DST等情况。
那么为了根据我的时区获得精确答案,我应该怎么做?我能想到的唯一办法就是回到使用LocalDate
,但首先从ZonedDateTime
值归一化时区,然后使用Duration
。
ZoneId bornIn = ZoneId.of("America/New_York");
ZonedDateTime born = ZonedDateTime.of(1960, Month.JANUARY.getValue(), 1, 2, 34, 56, 0, bornIn);
ZonedDateTime now = ZonedDateTime.now();
ZonedDateTime nowNormalized=now.withZoneSameInstant(born.getZone());
Period preciseBirthdayPeriod = Period.between(born.toLocalDate(), nowNormalized.toLocalDate());
int preciseDaysOld = preciseBirthdayPeriod.getDays();
但是这似乎过于复杂,只为了得到一个精确的答案。