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

时间:2017-05-27 13:56:21

标签: 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 Date(currentTime);
    Date newDate = new Date(newTime);
    // ...
}

enter image description here

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

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

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

这是不正确的,看起来GMT与此不同,但正如您所看到的,GMT在调试视图中都是+10。所以我不能为我的生活弄清楚Java正在做什么......请帮我解决这个问题?给定时间(以毫秒为单位),如何将其添加到给定日期?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

Answer by 3141是正确的,应该被接受。

TL;博士

Instant.now().plusMillis( 84_456_000L ) // In UTC.

java.time

使用取代麻烦的旧日期时间类的java.time类,这项工作会更容易和更清晰。

Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

Instant now = Instant.now() ;
Instant later = now.plusMillis( 84_456_000L ) ;

或者将您的时间段表示为对象。

Duration d = Duration.ofMillis( 84_456_000L ) ;

或者...

Duration d = Duration.ofHours( 23 ).plus( Duration.ofMinutes( 46 ) ) ;

应用持续时间。

Instant later = now.plus( d ) ;

答案 2 :(得分:-2)

您需要指定时区。例如:

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