JAVA-日期间隔时间,结果错误

时间:2014-01-04 16:19:39

标签: java date time

直升机, 我在减去两个日期时遇到问题,因为结果不正确:

  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

开始和停止之间应该只有三秒钟 - 为什么有一个小时? (取决于夏季/冬季时间?) 我需要计算开始和结束我的程序之间的时间,我只想得到小时,分钟和秒。有人可以帮忙吗?

4 个答案:

答案 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库使这种工作更容易。查看PeriodDurationInterval类。

与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