从Instant.now()生成的日期中提取日期,小时和分钟

时间:2018-03-19 06:45:39

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

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

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字段的lib,我可以使用它来获取日期,小时和分钟?

Chrono字段不提取完整日期。

2 个答案:

答案 0 :(得分:3)

由于您似乎对如何从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的时区设置,并在{{1}时使用它来生成String保持不受影响。

在特殊情况下,您只需要Date表示现在的日期时间,再次,除非您有非常具体的需求,否则它是不明智的,这很简单:

Date

结果与上述相同。

链接

答案 1 :(得分:2)

ZonedDateTime包含getHour()getMinute()等方法,应该足够了。