【发布时间】:2009-09-01 16:03:09
【问题描述】:
是否有一种简单或优雅的方法来仅获取 Java 日期(或日历,对我来说真的不重要)的一天中的时间(小时/分钟/秒/毫秒)部分?我正在寻找一种单独考虑日期(年/月/日)和时间部分的好方法,但据我所知,我坚持单独访问每个字段。
我知道我可以编写自己的方法来单独获取我感兴趣的字段,但我会将其作为静态实用程序方法来执行,这很难看。另外,我知道 Date 和 Calendar 对象具有毫秒精度,但在这两种情况下我都看不到访问毫秒组件的方法。
编辑:我不清楚这一点:使用 Date::getTime() 或 Calendar::getTimeInMillis 之一对我来说并不是非常有用,因为它们返回的毫秒数纪元(由该日期或日历表示),它实际上并未将一天中的时间与其余信息分开。
@Jherico 的答案是最接近的,我认为,但绝对是我仍然必须将其融入我自己编写的方法中。这不完全是我想要的,因为它仍然在返回的毫秒值中包含小时、分钟和秒 - 尽管我可能可以让它为我的目的工作。
我仍然认为每个组件都是独立的,当然,它们不是。您可以将时间写入自任意参考日期以来的毫秒数,也可以写入与year/month/day hours:minutes:seconds.milliseconds 完全相同的时间。
这不是为了显示目的。我知道如何使用DateFormat 来制作漂亮的日期字符串。
编辑 2: 我最初的问题来自我发现自己编写的一小部分实用程序函数 - 例如:
- 检查两个
Dates 是否代表同一天的日期时间; - 检查某个日期是否在其他两个日期指定的范围内,但有时会包含检查,有时则不检查,具体取决于时间部分。
Joda Time 有这种功能吗?
编辑 3: @Jon 关于我的第二个要求的问题,只是为了澄清:第二个要求是使用我的 Dates 有时代表一整天的结果 - 其中时间部分并不重要全部 - 有时表示日期时间(即,IMO,对于包含 year/month/day 和 hours:minutes:seconds:... 的事物的最准确词)。
当 Date 表示一整天时,它的时间部分为零(例如,Date 的“时间部分”是午夜),但语义规定范围检查是在结束日期包含在内完成的。因为我只是将此检查保留到 Date::before 和 Date::after,所以我必须将 1 天添加到结束日期 - 因此日期的时间部分为零时的特殊情况。
希望这没有让事情变得不那么清楚。
【问题讨论】:
-
这是为了展示目的吗?
-
来自文档:System.currentTimeMillis() 以毫秒为单位返回当前时间。
-
Joda 肯定会让第一个变得简单。我不确定我是否理解第二个要求。
-
wrt 编辑 2:Joda 具有
Interval的概念,它可以测试是否包含日期或之前/之后等。它还允许直观地操作其DateTime对象,以便您可以轻松测试“同一天的日期时间”。 -
我只能梦想,如果一切都在一个共同的基础(首选 2、10 或 16)中,并且整个世界都是一个单一的,那么使用日期和时间会变得多么容易时区。 :P