4

Wordpressベースのウェブサイトでビジネスを開いているときに通知を表示し、データベースから情報を取得しようとしています。データは、個別のデータベースエントリとして、毎日の開始/終了時間として単純に保存されます。時間が1日以内であれば、それはかなり簡単です。しかし、バー/レストランの場合、閉店時間は技術的には翌日であるため、複雑になります。例として火曜日を使用します。

$tuesdayopen = strtotime("10:00");
$tuesdayclose = strtotime("23:00");
$now = strtotime("now");

if ($now >= $tuesdayopen && $now <= $tuesdayclose) {
    echo "We are open!";
} else {
    echo "We are closed!";
}

したがって、これはそのままで正常に機能します。そして、閉店時間が翌日になるとしたら、私にもそのための洗練されていない解決策があります。

$tuesdayopen = strtotime("10:00");
$tuesdayclose = strtotime("02:00");
$now = strtotime("now");

if ($tuesdayclose >= strtotime("00:00") && $tuesdayclose <= strtotime("04:00")):
    $tuesdayclose = strtotime("+1 day", $tuesdayclose);
endif;

if ($now >= $tuesdayopen && $now <= $tuesdayclose) {
    echo "We are open!";
} else {
    echo "We are closed!";
}

それで、私の問題はどこにありますか?問題は、$nowが真夜中過ぎになってしまうことです。したがって、誰かが火曜日の夜、真夜中以降にページにアクセスした場合、技術的には水曜日の朝になります。つまり、私の完全なスクリプトは水曜日に移動します。午前0時から午前4時の間であることを認識する必要があるため、前日の開店時間と閉店時間を使用して、開店しているかどうかを判断します(ただし、閉店時間が深夜以降の場合のみ、それ以外の場合は水曜日に移動するのが適切です。する)。うまくいけば、私はそれをうまく説明しました。私は自分で何かを書いてみましたが、コードは肥大化した混乱であり、最終的には機能しません。だから私はここにそれを含めることを気にしません。

4

2 に答える 2

3

場所が開いている時間で配列を作成し、それをループします。さらに、たとえば昼食時に場所が閉まった場合でも、簡単に追加できるという利点があります。

時刻が未来か過去かに関係なく、月曜日00:00からの秒数をカウントするように時間を正規化することに注意してください。

<?php

// Normalize time to count from 0
function timeOfWeek($time) {
  if (!is_int($time)) $time = strtotime($time) ;
  $secondsInWeek = (7 * 24 * 3600);
  return (($time - strtotime('monday 00:00')) % $secondsInWeek + $secondsInWeek) % $secondsInWeek;
}

function isOpen($opened, $time) {
  $time = timeOfWeek($time);

  foreach ($opened as $openday) {
    list($open, $close) = $openday;

    if ($open < $close) { 
      if ($time > $open && $time < $close) return true;
    } else {
      if ($time > $open || $time < $close) return true; // Special case sunday -> monday
    }
  }

  return false;
}

$opened = array();
$opened[] = array(timeOfWeek('monday 10:00'), timeOfWeek('monday 23:00'));
$opened[] = array(timeOfWeek('tuesday 10:00'), timeOfWeek('tuesday 23:00'));
$opened[] = array(timeOfWeek('wednesday 10:00'), timeOfWeek('wednesday 23:00'));
$opened[] = array(timeOfWeek('thursday 10:00'), timeOfWeek('thursday 23:00'));
$opened[] = array(timeOfWeek('friday 10:00'), timeOfWeek('saturday 01:00'));
$opened[] = array(timeOfWeek('saturday 10:00'), timeOfWeek('sunday 01:00'));
$opened[] = array(timeOfWeek('sunday 10:00'), timeOfWeek('monday 01:00'));

$open = isOpen($opened, time());
var_dump($open);
于 2013-01-02T01:41:41.043 に答える
-2

単にタイムゾーンをyourTimeZone-4hに変換できます!

于 2013-01-02T01:14:05.287 に答える