Java 为什么以毫秒为单位添加时间会显示不正确的结果?

Java 为什么以毫秒为单位添加时间会显示不正确的结果?,java,datetime,Java,Datetime,在我的调试视图中,我无法了解以下代码的情况: public void addTime(int day, long offsetMillis) { long currentTime = mCalendar.getTimeInMillis(); long newTime = currentTime + offsetMillis; Date offsetDate = new Date(offsetMillis); Date currentDate = new Dat

在我的调试视图中,我无法了解以下代码的情况:

public void addTime(int day, long offsetMillis) {

    long currentTime = mCalendar.getTimeInMillis();
    long newTime = currentTime + offsetMillis;

    Date offsetDate = new Date(offsetMillis);
    Date currentDate = new Date(currentTime);
    Date newDate = new Date(newTime);
    // ...
}

我需要将以毫秒为单位的时间添加到当前时间。查看调试状态,我可以看到offsetDate转换为23:46,这是我想要添加的正确时间量

currentDate是当前时间,即给定日期00:00的开始时间

newDate是当前时间加上偏移量,转换为13:46


这是不正确的,看起来这里的GMT是不同的,但是正如您所看到的,在调试视图中,GMT都是+10。所以我一辈子都搞不懂Java在做什么。。。请帮我解决这个问题好吗?给定以毫秒为单位的时间,如何将其添加到给定日期?

您需要指定时区。例如:

Date curr_date = new Date(System.currentTimeMillis("YOUR_TIMEZONE_HERE"));

您需要指定您的时区。例如:

Date curr_date = new Date(System.currentTimeMillis("YOUR_TIMEZONE_HERE"));

所有的计算都是正确的。您指定的毫秒数实际上等于13小时46分钟。offsetDate仅显示23:46,因为时区设置为GMT+10


Unix时间戳通过计算自1970年1月1日00:00 UTC以来经过的毫秒数来工作。此日期相当于1970年1月1日10:00 UTC+10。因此,为offsetDate显示的时间本身被10小时抵消。

所有计算都是正确的。您指定的毫秒数实际上等于13小时46分钟。offsetDate仅显示23:46,因为时区设置为GMT+10

Unix时间戳通过计算自1970年1月1日00:00 UTC以来经过的毫秒数来工作。此日期相当于1970年1月1日10:00 UTC+10。因此,为offsetDate显示的时间本身偏移了10小时。

是正确的,应该接受

tl;博士 java.time 使用java.time类取代麻烦的旧日期时间类,这项工作将更容易、更清晰

该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

或者将您的时间跨度表示为对象

Duration d = Duration.ofMillis( 84_456_000L ) ;
或者

应用持续时间

Instant later = now.plus( d ) ;
是正确的,应该被接受

tl;博士 java.time 使用java.time类取代麻烦的旧日期时间类,这项工作将更容易、更清晰

该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

或者将您的时间跨度表示为对象

Duration d = Duration.ofMillis( 84_456_000L ) ;
或者

应用持续时间

Instant later = now.plus( d ) ;

理想情况下,您应该使用
java.time
类而不是
Date
您应该使用
java.time
类而不是
Date