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

问题描述 投票:0回答:2

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

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
2个回答
23
投票

既然您似乎对如何从您的

ZonedDateTime
获取日期感到困惑,我想补充一下Claudiu Guja'一个很好且正确的答案

    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();

结果与上面相同。

链接


1
投票

ZonedDateTime
getHour()
getMinute()
getMonth
getYear
getdayOfMonth
等方法,应该足够了。您可以使用各自的方法简单地获取年、月和日。

如果您希望所有这些数据都在格式化字符串中,您可以使用

ZonedDateTime
格式化
DateTimeFormatter
以获得您喜欢的字符串。或者,您始终可以使用
LocalDate
方法从
ZonedDateTime
获得
toLocalDate

© www.soinside.com 2019 - 2024. All rights reserved.