【问题标题】:Extracting date, hour and minute from Instant.now() generated date [closed]从 Instant.now() 生成的日期中提取日期、小时和分钟 [关闭]
【发布时间】:2018-08-27 16:06:15
【问题描述】:

我有这段代码可以生成日期和时间,

ZoneId z = ZoneId.of( "Africa/Nairobi" );

Instant instant = Instant.now();

ZonedDateTime zdt = instant.atZone(z);

return zdt.toString();

//2018-03-19T09:03:22.858+03:00[Africa/Nairobi]

是否有类似 chrono - https://docs.oracle.com/javase/8/docs/api/java/time/temporal/ChronoField.html 字段的库可用于获取日期、小时和分钟?

Chrono 字段不会提取完整的日期。

【问题讨论】:

  • “获取日期”是什么意思?您想分别调用日、月和年吗?

标签: java datetime hour zoneddatetime java.time.instant


【解决方案1】:

ZonedDateTime 有诸如getHour()getMinute() 之类的方法就足够了。

【讨论】:

  • 我明白了,但没有日期。
  • 好的,那么 .getMonth、.getYear 和 .getdayOfMonth 方法呢?还是您希望将所有这些数据都放在一个可格式化的字符串中?
  • 我希望你不是要java.util.Date
  • Date 是简单的millisecond
  • 你想以什么格式提取日期?您可以使用各自的方法简单地获取年、月和日,或者您可以使用 DateTimeFormatter 格式化 ZonedDateTime 以获得您喜欢的字符串。或者,您总是可以从 ZonedDateTime 获得 LocalDate。你到底想要什么?
【解决方案2】:

由于您似乎对如何从您的ZonedDateTime 获取日期感到困惑,我想补充一下Claudiu Guja’a good and correct answer

    ZoneId z = ZoneId.of("Africa/Nairobi");
    ZonedDateTime zdt = ZonedDateTime.now(z);
    System.out.println("Date         " + zdt.toLocalDate());
    System.out.println("Year         " + zdt.getYear());
    System.out.println("Month        " + zdt.getMonth());
    System.out.println("Day of month " + zdt.getDayOfMonth());

这是刚刚打印出来的:

Date         2018-03-19
Year         2018
Month        MARCH
Day of month 19

请查看文档以获取更多方法,包括 getMonthValue 获取月份数(1 到 12)。我在底部包含一个链接。因为ZonedDateTime 类有一个now 方法,所以你不需要先Instant.now()

如果你想要一个老式的 java.util.Date 对象——第一个答案是:不要。您已经在使用的现代 API 更易于使用。仅当您需要 Date 用于某些您无法更改或现在不想更改的旧 API 时,获取 Instant 并进行转换:

    Instant instant = Instant.now();
    Date oldfashionedDateObject = Date.from(instant);
    System.out.println("Old-fashioned java.util.Date " + oldfashionedDateObject);

这个打印出来的:

Old-fashioned java.util.Date Mon Mar 19 12:00:05 CET 2018

尽管字符串中的 CET 表示中欧时间,但 Date 不包含时区(这让很多人感到困惑)。只有它的toString 方法(当我将Date 附加到String 时隐式调用)获取JVM 的时区设置并使用它来生成String,而Date 不受影响。

在特殊情况下,您现在只想要一个代表日期时间的Date,同样,除非您有非常具体的需要,否则这是不明智的,这很简单:

    Date oldfashionedDateObject = new Date();

结果同上。

链接

【讨论】:

  • 感谢您的信任。可悲的是,我没有注意到我对答案有疑问,否则我会自己回答......
猜你喜欢
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
相关资源
最近更新 更多