3

我有这个生成日期和时间的代码,

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 字段不会提取完整的日期。

4

2 回答 2

11

由于您似乎对如何从您的日期获取日期感到困惑ZonedDateTime,我想补充克劳迪乌古贾一个好的和正确的答案

    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到 a时隐式调用String)获取 JVM 的时区设置并使用它来生成不受影响String的时间。Date

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

    Date oldfashionedDateObject = new Date();

结果与上述相同。

链接

于 2018-03-19T11:00:31.513 回答
1

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

于 2018-03-19T06:47:15.467 回答