获取 Java 日期或日历的时间组件

2022-09-03 05:43:20

有没有一种简单或优雅的方法可以只获取Java日期(或日历,这对我来说真的无关紧要)的一天中的时间(小时/分钟/秒/毫秒)部分?我正在寻找一种很好的方式来分别考虑日期(年/月/日)和时间部分,但据我所知,我只能单独访问每个字段。

我知道我可以编写自己的方法来单独获取我感兴趣的字段,但是我会把它作为静态效用方法来做,这很丑陋。另外,我知道 Date 和 Calendar 对象具有毫秒级精度,但在这两种情况下,我都看不到访问毫秒组件的方法。


编辑:我不清楚这一点:使用Date::getTime()或Calendline::getTimeInMillis之一对我来说并不是很有用,因为它们返回自纪元以来的毫秒数(由该日期或日历表示),这实际上并没有将一天中的时间与其他信息分开。

我认为@Jherico的答案是最接近的,但绝对是我仍然必须加入我自己写的方法。这并不是我想要的,因为它仍然包括返回的毫秒值中的小时,分钟和秒 - 尽管我可能会让它为我的目的工作。

我仍然认为每个组件都是独立的,尽管当然它们不是。可以将时间写为自任意引用日期以来的毫秒数,也可以将时间写为 与 完全相同的时间。year/month/day hours:minutes:seconds.milliseconds

这不用于显示目的。我知道如何使用a来制作漂亮的日期字符串。DateFormat


编辑 2:我最初的问题来自我发现自己编写的一小组实用程序函数 - 例如:

  • 检查两个 s 是否表示同一天的日期时间;Date
  • 检查日期是否在由其他两个日期指定的范围内,但有时检查(包括),有时不检查,具体取决于时间分量。

Joda Time有这种类型的功能吗?


编辑3:@Jon关于我的第二个要求的问题,只是为了澄清:第二个要求是使用我的日期有时表示一整天的结果 - 其中时间部分根本不重要 - 有时表示日期时间(即IMO,包含的最准确的单词)。year/month/dayhours:minutes:seconds:...

当日期表示一整天时,其时间部分为零(例如,日期的“时间分量”为午夜),但语义规定范围检查在结束日期完成。因为我只是将此检查保留为 Date::before 和 Date::after,因此我必须在结束日期中添加 1 天 - 因此,当日期的时间部分为零时,需要特殊大小写。

希望这不会让事情变得不那么清楚。


答案 1

好吧,我知道这是一个可预测的答案,但是...使用Joda Time。这对“日期”,“即时”,“一天中的时间”等有单独的表示形式。它是一个更丰富的API,通常比内置类IMO更健全。

如果这是您一感兴趣的日期/时间操作,那么它可能有点过分了......但是,如果您将内置的日期/时间API用于任何重要的事情,我强烈建议您尽快将其从Joda转移到Joda。

顺便说一句,您应该考虑您感兴趣的时区。A 有关联的时区,但 a 没有(它只是表示时间上的一个瞬间,以 Unix 时代的毫秒为单位)。CalendarDate


答案 2

提取一天中的时间部分应该是获取剩余毫秒数的问题,当您除以每天的毫秒数时。

long MILLIS_PER_DAY = 24 * 60 * 60 * 1000;
Date now = Calendar.getInstance().getTime();
long timePortion = now.getTime() % MILLIS_PER_DAY;

或者,考虑使用joda-time,这是一个功能更齐全的时间库。