直升机, 我在减去两个日期时遇到问题,因为结果不正确:
public static void main(String[] args) throws ParseException, InterruptedException{
DateFormat format = new SimpleDateFormat("HH:mm:ss");
long start = System.currentTimeMillis();
Thread.sleep(3000);
long goal = System.currentTimeMillis();
long wyn = goal - start;
Date result = new Date(wyn);
System.out.println("Test1: " + format.format(result));
}
结果: 测试1:01:00:03
开始和停止之间应该只有三秒钟 - 为什么有一个小时? (取决于夏季/冬季时间?) 我需要计算开始和结束我的程序之间的时间,我只想得到小时,分钟和秒。有人可以帮忙吗?
答案 0 :(得分:4)
Date
类不适用于间隔。它适用于特定时刻。以下
long wyn = goal - start;
将等于3000
左右。当Unix Epoch用作Date
构造函数的参数时,这是3000毫秒。根据您的时区,这将是一些小时+3秒。
考虑使用Joda Time API,它具有Interval
接口,可用于计算间隔。
答案 1 :(得分:3)
您正在将间隔转换为Date
对象。 这是错误的。
Date
对象用于表示某个时间点,不一段时间。
您应该做的是以下内容:
long wyn = goal - start;
System.out.println("Test1: " + wyn); //prints the interval in milliseconds
结果:
Test1: 3000
如果使用Date
构建wyn
对象,则会创建一个Date
对象,表示“epoch”之后3秒的时间点(1970年1月1日,格林威治标准时间00:00:00)。
您看小时的原因是因为1970年使用的时区与现在使用的时区不同。出于同样的原因,我得到Test1: 07:30:03
。
答案 2 :(得分:0)
获取所需的格式,而不会滥用Date类:
public static String toHMS(int milliseconds){
DecimalFormat twoDigit = new DecimalFormat("00");
int secs = milliseconds/1000;
String secsString = twoDigit.format(secs%60);
int minutes = secs/60;
String minsString = twoDigit.format(minutes%60);
int hours = minutes/60;
String hoursString = twoDigit.format(hours);
return hoursString + ":" + minsString + ":" + secsString;
}
答案 3 :(得分:0)
answer by ADTC是正确的。
滚动您自己的日期时间计算是有风险的业务。时区Daylight Savings Time(DST)和other anomalies会使此类尝试失败。
由于我们拥有编写良好且经过调试的代码,因此滚动自己是愚蠢的。目前我们有Joda-Time库,而Java 8我们将拥有新的java.time。*类(受Joda-Time启发)。 Joda-Time的课程只是为了你试图控制,处理一段时间。
以下内容从我最近发布的答案复制到类似问题,展示了如何正确定义时间范围并呈现描述该跨度的字符串。
Joda-Time 2.3库使这种工作更容易。查看Period,Duration和Interval类。
与java.util.Date相反,在Joda-Time中,DateTime
实例确实知道其指定的时区。
ISO 8601标准定义了一种以PnYnMnDTnHnMnS
格式将durations描述为小时,分钟等的方法。我在下面的示例代码中使用它。 Joda-Time也提供其他方式。
// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;
DateTimeZone timeZone = DateTimeZone.forID( "Europe/London" );
DateTime dateTimeNew = new DateTime( timeZone );
DateTime dateTimeOld = dateTimeNew.minusHours( 2 );
Period period = new Period( dateTimeOld, dateTimeNew );
转储到控制台...
System.out.println( "dateTimeNew: " + dateTimeNew );
System.out.println( "dateTimeOld: " + dateTimeOld );
System.out.println( "period: " + period );
跑步时......
dateTimeNew: 2014-01-02T23:19:45.021Z
dateTimeOld: 2014-01-02T21:19:45.021Z
period: PT2H