我需要以毫秒为单位计算距离圣诞节的时间。我正在使用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 文档,但找不到答案。
要计算毫秒,很简单 - 根本不需要通过
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());
}
}
int
的长度为32位,可以存储-2147483648
和2147483647
之间的任何值,如果它是默认的有符号,unsigned
它在0和4294967295
之间,一旦这些值超过它,就会溢出,发生并且值被环绕,例如 2147483647 + 1 == -2147483648
,在您的情况下,如果您尝试设置更大的值,则类型 long
是 64 位,因此它 can
保存更大的值,在这种情况下可能会这样做,对于 int,也会发生同样的情况,这就是为什么您可能会得到错误的值。
DateTimeUtils.getDurationMillis
返回 long
以下引用来自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())
表示时间线上的瞬时点。
或者,您可以将 OffsetDateTime
与
ZoneOffset.UTC
一起使用,如下所示:
ChronoUnit.MILLIS.between(OffsetDateTime.now(ZoneOffset.UTC), OffsetDateTime.of(LocalDate.of(2023, 12, 25), LocalTime.MIN, ZoneOffset.UTC))
从