32 часа назад, исключая выходные с php

Итак, у меня есть скрипт, который делает несколько проверок на 32, 48 и 72 часа назад. В основном я проверяю свою базу данных на наличие записей, которым не менее x часов.

Теперь это работает нормально, как это:

$date = date('Y-m-d H:i:s',strtotime('-32 hours')); 
$q    = "SELECT * FROM `table` WHERE `date` <= '".$date."'";

Теперь я хочу исключить выходные. Я знаю, что вы можете использовать weekdays в strtotime, чтобы получить этот эффект, однако это не работает в течение нескольких часов.

В течение 48 часов это легко, потому что я могу просто сделать следующее:

echo date('Y-m-d H:i:s',
          strtotime(date("Y-m-d H:i:s").
          " -2 weekdays ".
          date('H:i:s')));

На 72 часа тоже легко, потому что это 3 дня. Однако 32 часа создают проблему, потому что это ± 1,3 дня.

В заключение, как мне получить дату и время 32 часа назад, исключая выходные.


person Kokos    schedule 15.11.2011    source источник


Ответы (3)


Используйте strtotime, как вы делали изначально:

$time = strtotime('-32 hours');

Затем выполните расчет выходных/будних дней вручную.

// If the day is Sunday or Saturday subtract a full day.
while (date('w', $time) % 6 == 0) {
    $time = strtotime('-1 day', $time);
}
$date = date('Y-m-d H:i:s', $time);
person nachito    schedule 15.11.2011
comment
Это работает безупречно! Это создаст проблемы при переходе более чем на 7 дней, потому что вы можете столкнуться с несколькими выходными, но для меня это не так. - person Kokos; 15.11.2011
comment
Фактически вы можете заменить цикл while оператором if, если вы также измените содержащийся в нем strtotime('last weekday '.date('H:i:s', $time), $time). Наверное, это не имеет большого значения. - person nachito; 15.11.2011

Я не уверен, что это правильно или лучший способ сделать это, но что-то вроде:

function getDateBackExcludingWeekend( $hours ) {
  $now = time();
  $secondsBack = $hours * 3600;

  $actual = $now - $secondsBack;
  $monday = strtotime("last monday");

  if( $actual < $monday ) {
    $diff = ($secondsBack - ($now - $monday));
    $backthen = ($monday - 172800 /* two days */) - $diff;

    return date("Y-m-d H:i:s", $backthen);
  }

  return date("Y-m-d H:i:s", $actual);
}
person mobius    schedule 15.11.2011

Почему бы просто не убрать два дня и добавить 16 часов полуавтоматически, чтобы компенсировать это?

$DateTMP = date('Y-m-d h:i:s',(strtotime(date(Y-m-d)." -2 weekdays") + (60 * 60 * 16)));
person NekaraNef    schedule 15.11.2011
comment
Что произойдет во вторник в 14:00:00? -2 рабочих дня составляют пятницу 14:00:00, а затем вы добавляете 16 часов, чтобы получить субботу 6:00:00, которая не является рабочим днем. - person nachito; 15.11.2011
comment
Как вы думаете, почему я использовал дату('Г-м-д'), а не дату('Г-м-д Ч:и:с')? Чтобы обойти эту проблему. Вы можете предложить свое собственное решение, но воздержитесь от того, чтобы давать кому-то отрицательную репутацию без уважительной причины. - person NekaraNef; 15.11.2011
comment
Использование date('Y-m-d') не решает никаких проблем, а просто создает новые. Теперь время всегда будет фиксироваться на 16:00:00. - person nachito; 15.11.2011
comment
Эээ, нет, это будет зафиксировано в 00:00:01, или как там будет в первый момент нового дня. Я понимаю, что вы не согласны. Вы можете сделать это. Нельзя отрицать, что ваше решение также учитывает точное время суток, о чем я лично просто не стал бы беспокоиться. А если серьезно, ... если бы все давали отрицательную репутацию всем, с кем они не согласны, этот сайт превратился бы в огромный беспорядок за несколько минут. - person NekaraNef; 17.11.2011