date.getTime()比System.getCurrentTimeMillis()短

时间:2016-09-10 20:10:57

标签: java date time

我试图创建一个简单的闹钟,但我偶然发现了一个我似乎无法解决的问题。我试图将字符串解析为日期,以便我可以获得当前时间和引发警报的时间之间的差异。

这是解析时间的代码:

SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss");
sdf.setTimeZone(getTimezone());

Date date = sdf.parse(args[0]);

这是我的getTimezone()方法:

public static TimeZone getTimezone() {
    Calendar cal = Calendar.getInstance();
    long milliDiff = cal.get(Calendar.ZONE_OFFSET);

    String [] ids = TimeZone.getAvailableIDs();
    String name = null;
    for (String id : ids) {
      TimeZone tz = TimeZone.getTimeZone(id);
      if (tz.getRawOffset() == milliDiff) {
        // Found a match.
        name = id;
        break;
      }
    }
    return TimeZone.getTimeZone(name);
}

这是我的代码,用于找出差异:

long diff = date.getTime() - System.currentTimeMillis();

所以我的问题是date.getTime()返回79680000,而System.currentTimeMillis()返回1473538047978(这当然是不同的,但由于某些奇怪的原因,date.getTime()不是)。 / p>

这意味着我在尝试找出差异时得到一个负数,因此我无法使用它。

编辑:经过一些调试后,我意识到它与未设置的年,月和日有关,但我不知道如何获得这些。

3 个答案:

答案 0 :(得分:3)

您确实注意到date.getTime()返回79680000,这是 1970年1月1日之后的22小时20分钟。问题是(正如您所注意到的)您没有解析年,月和日。

您可以通过以下方式完成:

SimpleDateFormat sdf = new SimpleDateFormat("DD/MM/YYYY hh:mm:ss"); 

示例输入20/04/2016 20:20:0将时间返回为Mon Jan 04 20:20:00 CET 2016(不要查看时区)。 1970年1月1日以后为1451935200000毫秒。

注意:更改字符串以符合您的格式要求(语法不言自明)。

答案 1 :(得分:1)

accepted answer by Ronin是正确的。您正尝试将时间值设置为日期时间类型。

java.time

此外,您正在使用麻烦的旧旧日期时间类。现在取代了java.time类。

对于没有日期且没有时区的时间值,请使用LocalTime

LocalTime alarmTime = LocalTime.parse( "12:34" );

获取当前时间需要一个时区。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalTime now = LocalTime.now( z );

但是既然我们正在设置警报,我们也关心日期。

ZonedDateTime now = ZonedDateTime.now( z );
ZonedDateTime alarm = null;
if ( now.toLocalTime().isBefore( alarmTime ) ) {
    alarm = ZonedDateTime.of( now.toLocalDate() , alarmTime , z );
} else {. // Else too late for today, so set alarm for tomorrow.
    alarm = ZonedDateTime.of( now.toLocalDate().plusDays( 1 ) , alarmTime , z );
}

要计算闹钟之前经过的时间,请使用持续时间类。

Duration untilAlarm = Duration.between( now , alarm );

您可以查询持续时间总计毫秒数。但是要知道java.time类能够处理纳秒。

long millis = untilAlarm.toMillis();

答案 2 :(得分:0)

<强>更新 您只在代码中使用没有与日期对象约会的时间(仅解析时间)。如果您在此处添加日期,则您的日期应与System.getCurrentTimeMillis()调用相当。如果您从过去的日期中减去当前的毫秒数,您将得到负数。我更喜欢这种转换(date2在date1之后):

long diffInMillies = date2.getTime() - date1.getTime();
return TimeUnit.convert(diffInMillies, TimeUnit.MILLISECONDS);