Java 中的简单日期类

问题描述 投票:0回答:6

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 应该是什么。

java date time calendar
6个回答
3
投票

是的,您可以使用 Calendar 类进行计算。您可以构建日期并使用

getTimeInMillis()
进行比较。

我还推荐一个 joda-time java 库,它有很多日期功能。它也有更好的性能。


1
投票

您可以使用 Calendar 类来设置年、月和其他内容。

查看

calendar.set()
calendar.getTime(
) 方法的 javadocs。

然后,

date.getTime()
将为您提供 1970 年以来的绝对毫秒数。


0
投票

我会尝试使用 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 对象。


0
投票

你可以只用长的。但您仍然需要担心闰日。你可以像这样进行比较。

long start = System.currentTimeMillis(); // nanoTime is better for benchmarks
// do something.
long time = System.currentTimeMillis() - start;

但是,如果你必须考虑闰年等。日历可能是最好的选择,因为日期自然很混乱;)你可以考虑 JodaTime 库,它更好,但也简单不了多少。


0
投票

您可以使用 DateUtils 进行日期操作。自 Java 8 以来还有完整的新 API。


0
投票
tl;博士

在现代 Java 中使用

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() ;

© www.soinside.com 2019 - 2024. All rights reserved.