Java中是否有一个日期类,我可以用年、月、日、小时、分钟、秒和毫秒构造它,然后进行比较,给出两个日期值之间的毫秒数,忽略夏令时、闰秒等内容ETC?我可以为此使用 Calendar 类吗?我正在考虑这样做,但它谈到了闰秒和夏令时,我不希望这影响计算。
重要的是以下不变量始终成立:
对于所有 y1、y2、m1、m2、d1、d2、h、m、s、ms:
(
f(y1, m1, d1, h, m, s, ms).getTimeInMillis() -
f(y2, m2, d2, h, m, s, ms).getTimeInMillis()
)
%
(24 * 60 * 60 * 1000) == 0
我基本上需要知道函数 f 应该是什么。
是的,您可以使用 Calendar 类进行计算。您可以构建日期并使用
getTimeInMillis()
进行比较。
我还推荐一个 joda-time java 库,它有很多日期功能。它也有更好的性能。
您可以使用 Calendar 类来设置年、月和其他内容。
查看
calendar.set()
和 calendar.getTime(
) 方法的 javadocs。
然后,
date.getTime()
将为您提供 1970 年以来的绝对毫秒数。
我会尝试使用 Joda DateTime 你可以做的事情
DateTime d1 = new DateTime(y1,m1,d1,h1,m1,s1,ms1);
DateTime d2 = new DateTime(y2,m2,d2,h2,m2,s2,ms2);
long delta = d1.toMillis() - d2.toMillis();
另请考虑:
DateTime d1 = new DateTime(y1,m1,d1,h1,m1,s1,ms1);
DateTime d2 = new DateTime(y2,m2,d2,h2,m2,s2,ms2);
Duration delta = new Duration( d1, d2);
int days = delta.toPeriod().getDays();
如果您有不寻常的需求,您可能想看看 Joda Chronology 对象。
你可以只用长的。但您仍然需要担心闰日。你可以像这样进行比较。
long start = System.currentTimeMillis(); // nanoTime is better for benchmarks
// do something.
long time = System.currentTimeMillis() - start;
但是,如果你必须考虑闰年等。日历可能是最好的选择,因为日期自然很混乱;)你可以考虑 JodaTime 库,它更好,但也简单不了多少。
java.time 类。
Duration
.between(
LocalDateTime.of( year, month, dayOfMonth, hour, minute ) ,
LocalDateTime.of( year, month, dayOfMonth, hour, minute )
)
.toMillis()
注意:使用LocalDateTime
并不能解释时区发现的现实世界异常情况。上面的代码假设通用 24 小时。但根据时区,一天的长度可以是 23 小时、25 小时或其他长度。 避免遗留日期时间类
Calendar
类。该类是遗留日期时间类的一部分,已被 JSR 310 中定义的现代
java.time类取代。 java.time
Calendar
隐式应用了 JVM 当前的默认时区。
我建议不要依赖这种隐含的默认设置。明确指定您想要/预期的时区,即使您确实想要默认时区。ZoneId zoneId = ZoneId.of( "Asia/Tokyo" ) ;
或者:
ZoneId zoneId = ZoneId.systemDefault() ;
ZonedDateTime
ZonedDateTime
类及其
of
方法。
ZonedDateTime zdt = ZonedDateTime.of( year, month, dayOfMonth, hour, minute, second, nanoOfSecond, zoneId ) ;
ZonedDateTime
类说明时区带来的异常,例如
夏令时 (DST)。
LocalDateTime
LocalDateTime
类。此类忽略时区规则。
LocalDateTime ldt = LocalDateTime.of( year, month, dayOfMonth, hour, minute ) ;
要计算经过的时间,请使用
Duration
类。
Duration duration = Duration.between( someLdt , otherLdt ) ;
您想知道经过的时间(以毫秒为单位)。
long milliseconds = duration.toMillis() ;