时间不一致

时间:2016-03-27 16:51:25

标签: java date

我正在尝试实施时间安排。当传输不止一次时(在代码中由变量定义),程序必须通过使用测试用例的间隔来计算所选测试用例的下一个传输时间(通过这个例子15分钟) )。这意味着此测试用例必须每15分钟测试一次所有设备。对于下一个开始日期,使用所需的测试时间计算(在此示例中为1秒)。 firstTransmissionBeginDate是用户通过GUI执行的测试开始日期。

场景:我们有1个作业,间隔15分钟,需要1秒钟。它仅测试A组设备(仅限2台设备),我们的测试持续时间为1小时。所以我们期望看到4次传输。传输1.1开始18:30:00,传输1.2必须从18:30:01开始。传输2.1必须在15分钟后开始18:45:00传输2.2必须从18:45:01开始。传输3.1必须在15分钟后开始19:00:00传输3.2必须从19:00:01开始,依此类推。

但是下面的代码给出了   传输1.1开始18:30:00,传输1.2开始18:30:01。传输2.1开始15分钟后18:45:01传输2.2开始18:45:01。传输3.1开始15分钟后19:00:01传输3.2开始19:00:01等等。

我的代码:

//计算下一个开始日期

      Date tmpDate = df.parse(firstTransmissionBeginDate);
      long neededTestTime = (long) Math.ceil(selectJob.getNeededTestTime());
      Date nextBeginDate = new Date(tmpDate.getTime() + (neededTestTime * 1000));
      firstTransmissionBeginDate = df.format(nextBeginDate);

//对于第二次和更多次传输

  int times = 0;
  long intervalMiliseconds = selectJob.getInterval() * 1000;
  if (intervalMiliseconds <= differ) {
    times = (int) (differ / intervalMiliseconds);
  } else {
    times = (int) ((differ / intervalMiliseconds) + 1);
  }

  long neededTestTime = (long) Math.ceil(selectJob.getNeededTestTime());
  Date timesDate = df.parse(firstTransmissionBeginDate);
  timesDate = new Date(timesDate.getTime() - (neededTestTime * 1000));
  for (int i = 1; i < times; i++) {
    Date nextExecutionBeginDate = new Date(timesDate.getTime() + intervalMiliseconds);
    timesDate = nextExecutionBeginDate;

2 个答案:

答案 0 :(得分:3)

以下程序按您想要的顺序生成数字 - 从零0,1,15,16,30,31等开始。

      long firstTransmissionBeginDate=0;
      long tmpDate = firstTransmissionBeginDate;
      long neededTestTime = 15;
    System.out.println(firstTransmissionBeginDate);

// For 2nd and more transmissions

  int times = 0;
  long intervalMiliseconds = 15;

  long timesDate = firstTransmissionBeginDate;
  for (int i = 1; i < 8; i++) {
    long nextExecutionBeginDate = ((i%2)==1)?timesDate + 1:timesDate + intervalMiliseconds;
    System.out.println(nextExecutionBeginDate);
    if((i%2)==0) timesDate = nextExecutionBeginDate;
  }

您可以将它们包装在日期中并触发事件。

答案 1 :(得分:2)

听起来你应该使用ScheduledThreadPoolExecutor及其方法scheduleAtFixedRate。来自文档:

  

创建并执行首先启用的定期操作   在给定的初始延迟之后,以及随后的给定时期;   那是执行将在initialDelay之后开始   initialDelay + period,然后是initialDelay + 2 * period,依此类推。如果有的话   执行任务遇到异常,后续执行   被压制了。否则,任务将仅通过终止   取消或终止遗嘱执行人。如果有任何执行   任务花费的时间比其周期长,然后可能会执行后续执行   迟到,但不会同时执行。

所以提交一个runnable,它在调用时发送你需要的任何传输,并设置一个15分钟的时间。类似的东西:

ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);
executor.scheduleAtFixedRate(myRunnable, 0, 15, TimeUnit.MINUTES)