2

我有以下代码片段,可确定作业是否在其运行时内:

private boolean isDuringRuntime(Job job) {

    Date now = new Date();

    System.out.println(DateUtil.getToday());
    System.out.println(job.getStartTime().toString());
    System.out.println(job.getEndTime().toString());

    Date startTime = new Date(job.getStartTime().getTime() 
                                      + DateUtil.getToday().getTime());

    Date endTime = new Date(job.getEndTime().getTime() 
                                      + DateUtil.getToday().getTime());


    System.out.println("Start Time: " + startTime.toString());
    System.out.println("Stop Time: " + endTime.toString());

    return now.after(startTime) && now.before(endTime);
}

DateUtil.getToday()

public static Date getToday() {
    Date now = new Date();
    Calendar cal = Calendar.getInstance();
    cal.setTime(now);

    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);

    return cal.getTime();
}

这是一次运行的输出:

Sun Jul 14 00:00:00 EDT 2013 //This is DateUtil.getToday();
1970-01-01 13:15:00.0  //Raw Start Time
1970-01-01 18:15:00.0  //Raw End Time
Start Time: Sun Jul 14 18:15:00 EDT 2013  //Computed Start Time 
Stop Time: Sun Jul 14 23:15:00 EDT 2013   //Computed End Time

我不确定为什么计算的开始时间和计算的结束时间提前五个小时。我希望开始时间是Sun Jul 14 13:15:00 EDT 2013,结束时间是Sun Jul 14 18:15:00 EDT 2013

谁能指出我哪里出错了?我不是很熟悉,Date我怀疑我忽略了一些简单的东西。

4

2 回答 2

2

对象中的 Date 字段的含义是什么job

我感觉您正试图用日期对象表示“一天中的时间”。

这可能不是一个好主意。

如果您希望一项工作在一天中运行 6 小时,我会存储一个 long 表示 6 小时(以毫秒为单位):

static final long ONE_HOUR = 1000L * 60L * 60L;

Date today = DateUtil.getToday();
Date todayExecTime = new Date(today.getTime() + 6 * ONE_HOUR);

当然,如果您的语言环境使用夏令时,则此方法可能每年两次关闭一个小时(如果您的执行时间是在时间更改之后,通常是清晨)。如果您只想让 JobA 在一天中运行 6 小时(而不是在早上 6:00 运行),那没关系。


如果这是一个更复杂的调度系统的一小部分,您可能需要考虑使用库。

我从未使用过,但我一直听到人们在谈论石英

于 2013-07-14T19:02:07.417 回答
1

了解 Dates 不会包含完全本地化的日期时间,这些日期时间反映了您所在地区的当前可报告时间。

Date 是长整数的(可变)包装器,长整数是自 1970 年 1 月 1 日 UTC 以来经过的毫秒数。请注意,long 反映的是 UTC(就您的系统理解而言,但现在几乎所有系统都以某种方式与某种网络时间服务同步),而不是您的时区。

将 Date 映射到本地化的日期时间字符串时,您需要确保您使用的 Calendar 知道它需要从 UTC 映射到 EST(如果适用,则加上或减去 DST)。您描述的问题听起来像是时区映射问题,并且您创建的日历实例未使用 TimeZone 初始化。

于 2013-07-14T19:12:17.547 回答