【问题标题】:How to get next day end of day date time from given Instant ? (Java)如何从给定的 Instant 获取第二天结束的日期时间? (爪哇)
【发布时间】:2020-06-21 18:28:52
【问题描述】:

我有一个即时日期,例如:2020-03-09T20:13:57.089Z,我想在 Instant 中找到第二天的结束时间,例如 - 2020-03-10T23:59:59.089Z(与初始日期相比,这将是第二天的结束时间)

如何在 Java 中使用 Instant?

【问题讨论】:

  • 是的,使用现代 Java 日期和时间 API java.time 进行日期和时间工作。不,不要将一天的结束表示为 23:59:59-dot-something。将其表示为第二天的第一刻。它更简单,也更正确。只有永远记住这一天一直持续到那一刻独家
  • 0.089 秒从何而来?还是您只是想要 23:59:59?
  • 1) 你说“midnight”然后你说11:59:59.089Z,这是中午,那是什么? --- 2) 是否需要像您展示的那样保留 .089 毫秒?如果是这样,您应该明确说明,以澄清您的要求。
  • "2020-03-10T11:59:59.089Z(这将是第二天结束)" 我从来没有想过 中午(又名“中午”)是成为任何事情的“一天结束”。你确定你说的不是23:59:59吗?
  • 好的,所以对于第三次:示例显示时间是11:59:59,也就是中午 ,但您要求“一天结束”,也就是 midnight,即 23:59:59。请修正问题文本中的差异,即将 11 更改为 23,将“一天结束”/“午夜”更改为“一天中”/“中午”。

标签: java date time java-time


【解决方案1】:

一种方法是使用UTC 时区将Instant 转换为ZonedDateTime,并根据需要修改日期,然后将其转换回来

中午:

Instant result = instant.atOffset(ZoneOffset.UTC)
                        .plusDays(1).with(LocalTime.of(11,59,59,instant.getNano()))
                        .toInstant();

一天结束:

Instant result = instant.atOffset(ZoneOffset.UTC)
                        .plusDays(1).with(LocalTime.of(23,59,59,instant.getNano()))
                        .toInstant();

【讨论】:

  • 试试我更新的代码,它提供了你需要的@YashDamani
  • 很好的答案。 --- 但是,你应该使用atOffset() 而不是atZone()
  • 是的,我试过了。我在我的问题中犯了一个错误,这是我的错。尽管如此,我还是更新了我的问题并相应地调整了解决方案。谢谢! @死侍
【解决方案2】:

如果您想要实际的午夜(00:00),您可以使用:

instant.plus(1, ChronoUnit.DAYS).truncatedTo(ChronoUnit.DAYS);

否则,另一种解决方案是:

LocalDateTime ldt1 = LocalDateTime.ofInstant(instant.plus(1, ChronoUnit.DAYS), ZoneId.systemDefault());

ldt1 = ldt1
        .withHour(23)
        .withMinute(59)
        .withSecond(59);

Instant result = ldt1.atZone(ZoneId.systemDefault()).toInstant();

【讨论】:

  • 不,我不想要实际的午夜,而是第二天 (11:59)。对不起,这个问题应该更清楚。
  • 我认为ldt1.toLocalDate().atTime(23, 59, 59) 会更好,而不是ldt1.withHour(23).withMinute(59).withSecond(59),因为它将小数秒重置为0,并且中间对象更少。
  • 谢谢!我像你提到的那样增加了 2 天并减去了 2 天,它奏效了。 :) @Andreas
  • LocalDateTime的转换必须使用UTC时区,否则生成的时间将不是23:59:59Z
  • 这是真的!由于 Instant 对象默认处理 UTC,因此使用 Instant 函数对其进行转换也可以。 @安德烈亚斯
猜你喜欢
  • 2017-08-02
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多