【问题标题】:Current date and time in JavaJava 中的当前日期和时间
【发布时间】:2021-07-19 19:56:48
【问题描述】:

以这种格式返回当前日期和时间的最佳方式是什么?

2021-05-16T09:20:47-05:00

目前我正在这样做:

SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z");
Date date = new Date(System.currentTimeMillis());
strDate = formatter.format(date);

但我相信有更好的方法来完成我正在尝试的事情。

编辑:

OffsetDateTime.now() 完成这项工作。

【问题讨论】:

  • 看看现代的java.time API。
  • 谢谢,OffsetDateTime.now() 工作。
  • 您应该添加答案,而不是将其写为评论或答案的编辑。回答自己的问题没有问题。只是:写一个例子和输出的例子(不只是几句话)。请记住:这是一个参考网站,因此问题和答案应该对许多人有用(不仅仅是原作者)
  • @AndyTurner 想写一个答案以便我接受?

标签: java date datetime time format


【解决方案1】:

尝试使用(从 Java 8 开始)使用 DateTimeFormatter 格式化的 ZonedDateTime。 可以使用 DateTimeFormatterBuilder 类创建和配置 DateTimeFormatter 对象:

System.out.println(ZonedDateTime.now()
                     .format(new DateTimeFormatterBuilder()
                                  .append(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"))
                                  .appendOffsetId()
                                  .toFormatter()));

【讨论】:

  • 在这种情况下,OffsetDateTImeZonedDateTime 更准确,因为我们需要 UTC 偏移量(而不是像欧洲/莫斯科这样的时区)。
【解决方案2】:

java.time.OffsetDateTime

像其他人一样,我明确建议您使用 java.time,现代 Java 日期和时间 API,用于您的日期和时间工作。对于带有偏移量(例如 -05:00)的日期和时间,您需要的类是OffsetDateTime(这并不奇怪,是吗?)

    ZoneId zone = ZoneId.of("America/Monterrey");
    OffsetDateTime currentDateAndTime = OffsetDateTime.now(zone);
    System.out.println(currentDateAndTime);

我刚才运行代码时的输出:

2021-04-26T13:22:05.246327-05:00

如果您想要自己时区的偏移量,请将zone 设置为ZoneId.systemDefault()

我正在利用您要求 ISO 8601 格式的事实,并且 java.time 的类从它们的 toString 方法生成 ISO 8601 格式,因此没有任何显式格式化程序。

因此,如果您需要 String,只需:

    String currentDateAndTimeString = currentDateAndTime.toString();
    System.out.println(currentDateAndTimeString);

输出和以前一样。

如果你需要一个有秒但没有秒小数的字符串——你很可能不需要。正如我所写,您要求的格式是 ISO 8601,根据 ISO 8601 标准,秒和秒的小数部分是可选的,当它们不存在时被理解为零。因此,假设您需要此字符串用于外部服务或其他需要 ISO 8601 的组件,上述字符串就可以了。在任何情况下:编辑:截断秒的分数并使用标准格式化程序:

    String currentDateAndTimeWithSecondsOnly = currentDateAndTime
            .truncatedTo(ChronoUnit.SECONDS)
            .format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
    System.out.println(currentDateAndTimeWithSecondsOnly);

刚刚运行时的输出:

2021-04-26T23:53:22-05:00

链接

【讨论】:

  • 感谢您的回答。我刚刚确定标准格式化程序确实打印了秒,然后截断完成了打印没有小数部分的工作。我已经相应地编辑和简化了答案的最后一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
  • 2011-12-10
  • 2010-11-14
相关资源
最近更新 更多