32 часа назад, исключая выходные с php - PullRequest
4 голосов
/ 15 ноября 2011

Итак, у меня есть скрипт, который выполняет несколько проверок для 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 часа назад, исключая выходные.

Ответы [ 3 ]

3 голосов
/ 15 ноября 2011

Используйте 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);
1 голос
/ 15 ноября 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);
}
0 голосов
/ 15 ноября 2011

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

$DateTMP = date('Y-m-d h:i:s',(strtotime(date(Y-m-d)." -2 weekdays") + (60 * 60 * 16)));
...