Секунды между двумя датами, ограниченные переменным рабочим временем - PullRequest
1 голос
/ 08 октября 2011

Мне нужно получить количество секунд между двумя датами и только в рабочее время (например, 0800-1600). Любые предложения о том, как сделать это на Java?

long seconds = ((datenow.getTime() - datethen.getTime()) / 1000);

Ответы [ 3 ]

1 голос
/ 08 октября 2011

Вы можете использовать что-то вроде этого:

public static void main(String[] args) {
    Calendar cal1 = Calendar.getInstance();
    cal1.set(2011, 10, 10, 12, 00, 00);
    Date datenow = cal1.getTime();

    Calendar cal2 = Calendar.getInstance();
    cal2.set(2011, 10, 14, 15, 00, 00);
    Date datethen = cal2.getTime();

    // check for weekends
    long daynow = TimeUnit.MILLISECONDS.toDays(datenow.getTime());
    long daythen = TimeUnit.MILLISECONDS.toDays(datethen.getTime());
    long daydiff = daythen - daynow;
    long weekenddiff = daydiff / 7; // number of weekends

    if (cal1.get(Calendar.DAY_OF_WEEK) > cal2.get(Calendar.DAY_OF_WEEK)) {
        weekenddiff++;// we have a weekend but not another full week;
    }
    long secDiff = TimeUnit.SECONDS.convert(16, TimeUnit.HOURS);
    long weekendAdditionalSecDiff = TimeUnit.SECONDS.convert(16, TimeUnit.HOURS); // 16 additional hours for the weekend

    // 16 non-work hours between two shifts
    daydiff *= secDiff;
    daydiff += (weekenddiff * weekendAdditionalSecDiff); 
    long workDiffSeconds = TimeUnit.SECONDS.convert(
            datethen.getTime() - datenow.getTime(),
            TimeUnit.MILLISECONDS) - daydiff; 
    System.out.println("Difference in working hours is "
            + workDiffSeconds + " seconds");
    System.out.println("Difference in working hours is "
            + TimeUnit.HOURS.convert(workDiffSeconds, TimeUnit.SECONDS) + " hours");
}

, который сначала вычисляет количество дней между вашими днями и вычитает количество нерабочих-секунд-секунд из реальной разницы.

В выходные дни добавляется 8 дополнительных нерабочих часов в день.

0 голосов
/ 08 октября 2011
  1. Используйте что-то вроде Joda Time, (но это можно решить без).
  2. Предположим, day_now
  3. Рисунок ответа для day_now (дата-до полуночи datenow)
  4. Нарисуйте ответ для day_then (полночь предыдущего дня, затем дата DateT)
  5. Подсчитайте количество дней между ними.
  6. Объединение 1, 2 и 3
0 голосов
/ 08 октября 2011

Когда я это сделал, мне было проще всего взять две даты, начало и конец.

Затем выразите каждое в секундах.

Затем найдите полночь каждой даты, взяв мод каждой и 86400 (секунд в день).

И тогда это легко понять изтам.Ключ должен был найти конечные точки интервала в полночь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...