使用 Joda Time 获取圣诞节前的时间

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

我需要以毫秒为单位计算距离圣诞节的时间。我正在使用joda time,我尝试使用

Period
,但是在Google上浪费了很多时间后,我意识到这是错误的,我可以计算毫秒。但是,我的实现不正确,并且得到了错误的结果。

我的代码:

DateTime start = new DateTime(DateTime.now());
DateTime end = new DateTime(2012, 12, 25, 0, 0, 0 ,0);
org.joda.time.Duration duration = new Period(end, start).toDurationFrom(new Instant());
int millis = (int) DateTimeUtils.getDurationMillis(duration);
Log.d("Millis", String.valueOf(millis));

我尝试查看 Joda Time 文档,但找不到答案。

java datetime date jodatime duration
3个回答
4
投票

要计算毫秒,很简单 - 根本不需要通过

Period

long milliseconds = end.getMillis() - start.getMillis();

(顺便说一句,不清楚你为什么打电话给

new DateTime(DateTime.now())
- 只需
DateTime.now()
就足够了。)

编辑:它对我来说效果很好:

import org.joda.time.*;

public class Test {
    public static void main(String[] args) {
        DateTime start = DateTime.now();
        DateTime end = new DateTime(2012, 12, 25, 0, 0, 0, 0);
        System.out.println(end.getMillis() - start.getMillis());
    }
}

1
投票

int
的长度为32位,可以存储
-2147483648
2147483647
之间的任何值,如果它是默认的有符号,
unsigned
它在0和
4294967295
之间,一旦这些值超过它,就会溢出,发生并且值被环绕,例如
2147483647 + 1 == -2147483648
,在您的情况下,如果您尝试设置更大的值,则类型
long
是 64 位,因此它
can
保存更大的值,在这种情况下可能会这样做,对于 int,也会发生同样的情况,这就是为什么您可能会得到错误的值。

DateTimeUtils.getDurationMillis
返回
long


0
投票

java.time

以下引用来自Joda-Time主页的通知:

请注意,从 Java SE 8 开始,要求用户迁移到 java.time

 (JSR-310) - JDK 的核心部分,它将取代该项目。

因此,这个答案适合任何使用

现代日期时间 API 寻找解决方案的人。

使用java.time API的解决方案

ChronoUnit.MILLIS.between(Instant.now(), OffsetDateTime.of(LocalDate.of(2023, 12, 25), LocalTime.MIN, ZoneOffset.UTC).toInstant())

Instant

表示时间线上的瞬时点。

或者,您可以将

OffsetDateTime

ZoneOffset.UTC
 一起使用,如下所示:

ChronoUnit.MILLIS.between(OffsetDateTime.now(ZoneOffset.UTC), OffsetDateTime.of(LocalDate.of(2023, 12, 25), LocalTime.MIN, ZoneOffset.UTC))

在线演示

Trail:日期时间了解有关现代日期时间 API 的更多信息。

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