我试图创建一个简单的闹钟,但我偶然发现了一个我似乎无法解决的问题。我试图将字符串解析为日期,以便我可以获得当前时间和引发警报的时间之间的差异。
这是解析时间的代码:
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>
这意味着我在尝试找出差异时得到一个负数,因此我无法使用它。
编辑:经过一些调试后,我意识到它与未设置的年,月和日有关,但我不知道如何获得这些。答案 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类。
对于没有日期且没有时区的时间值,请使用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);