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

JAVA-日期间隔时间,错误的结果,java,date,time,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 = Sy

你好, 我对减去两个日期有问题,因为结果不正确:

  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

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

您正在将间隔转换为日期对象。这是错误的

日期对象用于表示时间点,而不是时间间隔

您应该做以下几点:

long wyn = goal - start;
System.out.println("Test1: " + wyn); //prints the interval in milliseconds
结果:

Test1: 3000
如果使用wyn构造日期对象,则创建的日期对象表示纪元1970年1月1日00:00:00 GMT后3秒的时间点


你之所以看到小时是因为1970年使用的时区与现在使用的时区不同。出于同样的原因,我得到Test1:07:30:03。

您正在将间隔转换为日期对象。这是错误的

日期对象用于表示时间点,而不是时间间隔

您应该做以下几点:

long wyn = goal - start;
System.out.println("Test1: " + wyn); //prints the interval in milliseconds
结果:

Test1: 3000
如果使用wyn构造日期对象,则创建的日期对象表示纪元1970年1月1日00:00:00 GMT后3秒的时间点

你之所以看到小时是因为1970年使用的时区与现在使用的时区不同。出于同样的原因,我得到了Test1:07:30:03。

日期类不适用于间隔。它是指特定的时间点。以下

long wyn = goal - start;
将相当于3000左右。当用作日期构造函数的参数时,是3000毫秒之后。根据您的时区,这将是一些小时数+3秒

考虑使用API,该API具有一个可用于计算间隔的间隔接口。

日期类不适用于间隔。它是指特定的时间点。以下

long wyn = goal - start;
将相当于3000左右。当用作日期构造函数的参数时,是3000毫秒之后。根据您的时区,这将是一些小时数+3秒


考虑使用API,该API具有一个可用于计算间隔的间隔接口。

要获得所需的格式,而不误用日期类,请执行以下操作:

  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;
  }

要获取所需格式,而不误用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;
  }
答案是正确的

滚动您自己的日期时间计算是一项冒险的业务。时区、DST,并使此类尝试容易失败

而且,滚动您自己的代码是愚蠢的,因为我们已经编写好并调试好了代码。目前,我们有Joda Time库,在Java8中,我们将有新的Java.Time.*类,这些类的灵感来自Joda Time。Joda Time的课程只是为了满足你的需要而建立的,你需要处理一段时间

下面是从我最近发布的一个类似问题的答案复制而来的,展示了如何正确定义时间跨度并呈现一个描述该跨度的字符串

2.3库使这类工作更容易。请看课程表和课程

与java.util.Date不同,在Joda Time中,DateTime实例确实知道其分配的时区

该标准定义了一种以PnYnMnDTnHnMnS格式描述小时、分钟等的方式。我在下面的示例代码中使用了它。Joda Time也提供了其他方式

//©2013巴西尔布尔克。此源代码可以由任何对此承担全部责任的人自由使用。 //导入org.joda.time.*; //导入org.joda.time.format.*; DateTimeZone timeZone=DateTimeZone.forID欧洲/伦敦; DateTime dateTimeNew=新的DateTime时区; DateTime dateTimeOld=dateTimeNew.2小时; 期间=新期间dateTimeOld,dateTimeNew; 转储到控制台

System.out.println dateTimeNew:+dateTimeNew; System.out.println dateTimeOld:+dateTimeOld; System.out.println期间:+期间; 当运行时

dateTimeNew:2014-01-02T23:19:45.021Z 日期时间:2014-01-02T21:19:45.021Z 期间:PT2H 答案是正确的

滚动您自己的日期时间计算是一项冒险的业务。时区、DST,并使此类尝试容易失败

而且,滚动您自己的代码是愚蠢的,因为我们已经编写好并调试好了代码。目前,我们有Joda Time库,在Java8中,我们将有新的Java.Time.*类,这些类的灵感来自Joda Time。Joda Time的课程只是为了满足你的需要而建立的,你需要处理一段时间

下面是从我最近发布的一个类似问题的答案复制而来的,展示了如何正确定义时间跨度并呈现一个描述该跨度的字符串

2.3库使这类工作更容易。请看课程表和课程

与java.util.Date不同,在Joda Time中,DateTime实例确实知道其分配的时区

该标准定义了一种方法t o以PnYnMnDTnHnMnS格式描述为小时、分钟等。我在下面的示例代码中使用了它。Joda Time也提供了其他方式

//©2013巴西尔布尔克。此源代码可以由任何对此承担全部责任的人自由使用。 //导入org.joda.time.*; //导入org.joda.time.format.*; DateTimeZone timeZone=DateTimeZone.forID欧洲/伦敦; DateTime dateTimeNew=新的DateTime时区; DateTime dateTimeOld=dateTimeNew.2小时; 期间=新期间dateTimeOld,dateTimeNew; 转储到控制台

System.out.println dateTimeNew:+dateTimeNew; System.out.println dateTimeOld:+dateTimeOld; System.out.println期间:+期间; 当运行时

dateTimeNew:2014-01-02T23:19:45.021Z 日期时间:2014-01-02T21:19:45.021Z 期间:PT2H
为了正确性,请注意:它不是Linux时代。为了正确性,请注意:它不是Linux时代。