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

14

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

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


1
“获取日期”是什么意思?您想分别调用获取日、月和年吗? - Dawood ibn Kareem
2个回答

22

因为您似乎对如何从您的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并不包含时区(这一点让很多人困惑)。只有当我将Date对象附加到String上时,它的toString方法(隐式调用)才会获取JVM的时区设置,并用于生成String,而Date本身则不受影响。
在特定情况下,如果您只需要表示当前日期和时间的Date对象,那么除非您有非常特定的需求,否则不建议使用,代码非常简单:
    Date oldfashionedDateObject = new Date();

结果与上面相同。

链接


谢谢您的信任。遗憾的是,我没有注意到我有关于答案的问题,否则我会自己回答的... - Claudiu Guja

1

ZonedDateTime有一些方法,例如getHour()getMinute()等,应该足够使用。


我明白了,但是没有任何日期。 - Gandalf
1
好的,那么.getMonth、.getYear和.getdayOfMonth方法怎么样?或者你想要所有这些数据以可格式化的字符串形式呈现? - Claudiu Guja
我希望你不是在问 java.util.Date - Axel
Date is - simple millisecond - oleg.cherednik
@ClaudiuGuja 我现在只想提取日期,因为我已经可以提取小时和分钟了。现在似乎需要从Instant.now()外获取日期。 - Gandalf
1
你想以什么格式提取日期?你可以使用它们各自的方法简单地获取年份、月份和日,或者你可以使用DateTimeFormatter格式化ZonedDateTime以获得你喜欢的字符串。或者,你总是可以从ZonedDateTime中获取LocalDate。你到底想要什么? - Claudiu Guja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接