2013-07-14 2 views
2

У меня есть следующий фрагмент кода, который определяет, будет ли работа находится в пределах его автономной работы:Java Дата Math Issue

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 

Я не уверен, время окончания - пять часов вперед. Я бы ожидал, что Start Time будет Sun Jul 14 13:15:00 EDT 2013, а End Time будет Sun Jul 14 18:15:00 EDT 2013.

Может ли кто-нибудь указать, где я иду не так? Я не знаком с Date, и я подозреваю, что я пропускаю что-то простое.

+1

Он отформатирован с использованием часового пояса вашего устройства. Вы опережаете 5 часов по Гринвичу? –

+0

Я ЭДТ. Но я читал, что 'java.util.Date' не учитывает часовой пояс, здесь: http://stackoverflow.com/a/2892156/714969 Учитывает ли это это в конструкторе? –

+0

Не могли бы вы предоставить код DateUtil.getToday() и job.getStartTime()? Кроме того, вы печатаете время начала и окончания 'followJob', но вы добавляете начальное и конечное время' job' до сегодняшнего дня. –

ответ

2

В чем смысл полей даты в вашем объекте job?

У меня такое ощущение, что вы пытаетесь представить «время суток» с объектом даты.

Это, вероятно, не очень хорошая идея.

Если вы хотите работать, чтобы работать 6 часов в день, я бы хранить долго, что представляет собой 6 часов в Millis:

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 утра), это не имеет значения.


Если это небольшая часть более сложной системы планирования, вам может потребоваться изучить библиотеку.

Я никогда не использовал один, но я слышу, что люди говорят о Quartz все время.

+0

Мне почти стыдно признаться в этом, но этот метод вызывается в кварцевой работе. Работа должна выполняться каждые 15 минут между определенными часами (зависит от работы). Я не думал, что смогу сделать это с помощью триггера cron. –

+0

@KevinBowersox - Если вам это нужно (запустите работу каждые 15 минут), вы можете посмотреть [TimerTask] (http://docs.oracle.com/javase/7/docs/api/java/util/TimerTask.html) , некоторые из [новых API параллелизма] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html) или даже [EJB timer] (http://docs.oracle.com/javaee/6/tutorial/doc/bnboy.html) (в зависимости от того, какие рамки вы используете). Это веб-приложение с помощью EJB? – jahroy

+0

Его веб-приложение с использованием Spring –

1

Понимать, что Даты не завершают полностью локализованные даты, которые отражают текущее отчетное время в вашем регионе.

Дата является (изменяемой) оберткой вокруг длинного целого числа, которое представляет собой миллисекунды, прошедшие с 1 января 1970 года по UTC. Обратите внимание, что long отражает UTC (как лучше, чем ваша система это понимает, но почти все системы в эти дни синхронизируются после моды с каким-то сетевым сервисом), а не ваш часовой пояс.

При сопоставлении даты с локализованной строкой datetime вам необходимо убедиться, что используемый вами календарь знает, что он должен отображаться с UTC до, скажем, EST (плюс или минус DST, если применимо). Проблема, которую вы описываете, звучит как проблема с отображением часового пояса, и созданный вами экземпляр календаря не инициализируется с помощью TimeZone.