【问题标题】:How to get yyyy-MM-dd from an Instant object in java 8.? [duplicate]如何从 Java 8 中的 Instant 对象获取 yyyy-MM-dd。 [复制]
【发布时间】:2021-03-26 07:46:38
【问题描述】:

我有一个 Instant 对象。我想将yyyy-MM-dd 作为字符串。我怎样才能实现它?

Instant defaultTime = Instant.now().truncatedTo(ChronoUnit.SECONDS);
System.out.println(defaultTime); // print 2021-03-26T00:00:00Z

我怎样才能得到"2021-03-26"

【问题讨论】:

  • 您在哪个时区查找日期?我会打电话给atZone(...).toLocalDate() 来获取LocalDate,此时它很容易格式化。

标签: java java-8 java-time


【解决方案1】:

我建议转换为LocalDateTime,然后使用DateTimeFormatter 喜欢

LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneOffset.UTC);
String result = ldt.format(DateTimeFormatter.ISO_LOCAL_DATE);

你可以找到格式化列表here,或者使用你自己的模式

其他方式

正如@Holger 在cmets 中所说,DateTimeFormatter.ISO_LOCAL_DATE.withZone(ZoneOffset.UTC) 产生了一个格式化程序,可以直接格式化Instant,并且可以共享和重用以格式化很多瞬间。

static final DateTimeFormatter INSTANT_FORMATTER
        = DateTimeFormatter.ISO_LOCAL_DATE.withZone(ZoneOffset.UTC);

使用喜欢

    String result = INSTANT_FORMATTER .format(instant);

@Ole V.V.提到在我的第一个 sn-p 中转换为LocalDateTime 会丢弃有关我们拥有哪个时间点的信息。当我们转换为ZonedDateTimeOffsetDateTime 时,我们可以保留这些信息。如果您想以 UTC 格式解释日期(如前面的示例中所示),例如:

    String result = instant.atOffset(ZoneOffset.UTC).format(DateTimeFormatter.ISO_LOCAL_DATE);

这使得操作依赖于解释的 UTC 选择更加明确。

【讨论】:

  • 或者直接String result = DateTimeFormatter.ISO_LOCAL_DATE.withZone(ZoneOffset.UTC) .format(instant);,不用LocalDateTime绕道。
  • @Holger,不错
  • @Holger 感谢您的选择。我个人的喜好是在答案中更明确地应用时区。我也更喜欢ZonedDateTime 而不是LocalDateTime。或者 OffsetDateTime 如果需要 UTC。所以defaultTime.atOffset(ZoneOffset.UTC).format(DateTimeFormatter.ISO_LOCAL_DATE).
  • @OleV.V.对于单次使用,没关系,但是DateTimeFormatter.ISO_LOCAL_DATE.withZone(ZoneOffset.UTC) 会生成一个可以共享和重用的格式化程序,以格式化很多实例。
  • @Holger 我发现你的建议和我的建议都应该保留在这里,尤其是各自的优缺点,所以我将它们编辑成答案。 IQbrod,如果你不喜欢的话。请恢复我的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
  • 1970-01-01
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 2011-05-09
  • 2011-03-05
相关资源
最近更新 更多