获取Java日期或日历的Time组件

Mat*_*all 16 java time calendar date

是否有一种简单或优雅的方法只能抓取Java Date(或日历)的一天中的时间(小时/分钟/秒/毫秒),这对我来说无关紧要?我正在寻找一种分别考虑日期(年/月/日)和时间部分的好方法,但据我所知,我不得不分别访问每个字段.

我知道我可以编写自己的方法来单独抓取我感兴趣的字段,但我会把它作为一个静态的实用方法,这很难看.另外,我知道Date和Calendar对象具有毫秒级的精度,但在任何一种情况下我都没有办法访问毫秒组件.


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

@ Jherico的回答是最接近的事情,我想,但绝对是我仍需要采用我自己编写的方法.这不是我想要的,因为它仍然包括返回毫秒值的小时,分​​钟和秒 - 尽管我可能会使它适合我的目的.

我仍然认为每个组件是分开的,当然,它们不是.您可以将时间写为自任意参考日期以来的毫秒数,或者您可以写出完全相同的时间year/month/day hours:minutes:seconds.milliseconds.

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


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

  • 检查两个Dates 是否代表同一天的日期时间;
  • 检查日期是否在由其他两个日期指定的范围内,但有时检查包含,有时不检查,具体取决于时间组件.

Joda Time有这种功能吗?


编辑3: @乔恩的问题,关于我的第二个要求,我只想澄清:第二个要求是用我的日期有时代表了整个天的结果-在时间组件并不在所有问题-有时代表一个日期-时间(这是IMO,包含year/month/day 和的 东西最准确的单词hours:minutes:seconds:....

当Date表示整天时,其时间部分为零(例如Date的"time component"为午夜),但语义规定范围检查在结束日期包含.因为我只是将这个检查留给Date :: before和Date :: after,所以我必须在结束日期添加1天 - 因此当Date的时间组件为零时的特殊外壳.

希望没有让事情变得不那么清楚.

Jon*_*eet 11

好的,我知道这是一个可预测的答案,但是...使用Joda Time.对于"日期","瞬间","一天中的某个时间"等,它有单独的表示.它是一个比内置类IMO更丰富的API和更普通的API.

如果这是你感兴趣的日期/时间操作的唯一一点,那么它可能有点过分......但是如果你使用内置的日期/时间API做任何重要的事情,我强烈建议你移动尽快离开它到Joda.

顺便说一句,你应该考虑什么时候带你感兴趣的.一个Calendar具有相关联的时区,但Date不(它只是代表了一个时刻,从Unix纪元以毫秒计).

  • 这是因为Java日期/时间API获得了对JDK中单个最差API和实现的投票.我敢肯定,当我们问自己时,我们所有的Java开发人员都记得我们的第一印象,"那么我如何用Java做日期/时间?" 然后看着Javadoc ...... (4认同)

Jhe*_*ico 9

提取当天的时间部分应该是当你除以每天的毫秒数时得到剩余的毫秒数.

long MILLIS_PER_DAY = 24 * 60 * 60 * 1000;
Date now = Calendar.getInstance().getTime();
long timePortion = now.getTime() % MILLIS_PER_DAY;
Run Code Online (Sandbox Code Playgroud)

或者,考虑使用joda-time,一个功能更全面的时间库.

  • 这取决于你所说的"当天的时间部分" - 它将*非常依赖于你感兴趣的时区...... (3认同)
  • 这个答案假定一天有24*60*60秒.你会惊讶地发现事情并非总是如此!原因是地球的旋转周期,几个世纪以来一直在减速(非常非常缓慢!).天文测量需要调整我们的时钟.例如,在2015年6月30日,当天增加了一秒钟.从1972年到2012年,平均每18个月插入一次闰秒.https://en.wikipedia.org/wiki/Leap_second (2认同)