0

日付がショップの正しい営業時間内にあることを検証する最善の方法は何だろうと思っていました...

私はゴルフのプロ向けのウェブサイトを作成しており、レッスンの予約を受け付けています。カレンダーに fullCalendar を使用し、Google カレンダーと統合して、プロのモバイルなどに簡単に同期できるようにしました。

カレンダーの一部として、顧客が時間枠をクリックすると、fullcalendar によって日付オブジェクトが提供されます。この選択されたスロットが、レッスンを受ける店舗の営業時間内にあるかどうかを検証したいなど。

時間はある時点で db テーブルから取得されますが、最適に機能する場合は JSON でページに返すことができますが、それはこの質問の目的ではありません...

曜日や「季節」によって開園時間が異なります【夏季・冬季】

ie:
 Summer Times
    Monday = 10:00 - 21:00
    Tuesday = 10:00 - 21:00
    Wednesday = 10:00 - 21:00
    Thursday = 10:00 - 21:00
    Friday = 10:00 - 21:00
    Saturday = 08:00 - 18:00
    Sunday = 08:00 - 18:00

 Winter Times
    Monday = CLOSED
    Tuesday = 10:00 - 18:30
    Wednesday = 10:00 - 18:30
    Thursday = 12.00 – 20.30
    Friday = 12.00 – 20.30
    Saturday = 08:00 - 18:00
    Sunday = 08:00 - 18:00

これを検証するための「最良の」方法は何でしょうか?

最善の選択肢は、ネストされた if/switch ステートメントを単純に実行することです..

[sudo code]
if(summer}
{
    switch(date.getDay())
    {
    case 1:
          if(time > mondayOpeningTime && time < mondayCloseTime)
          {
            return true;
          }
          else
          {
            return false;
          }
      break;
    case 2:
      execute code block 2
      break;
    .....
    default:
      code to be executed if n is different from case 1 and 2
    }
}
else
{
    // Same as summer logic but for winter times etc..
} 

または、これを行うより良い方法はありますか?

長い投稿/質問をお詫びしますが、それを読んで返信するのに時間を費やしている人に前もって感謝します:)

クリス

4

2 に答える 2

2

ここに私が書いたものがあります。大雑把ですが、閉店時間が深夜0時以降の場合を考慮しています。

Gist でも入手できます: https://gist.github.com/vtntimo/b5c724371bfb27bfb080

改善を作成する場合は、私に連絡してください:)

/*
    Operating hours check
    =====================================

    - Checks if something is open right now
    - Supports closing times going over midnight
    - Feel free to use in whatever you need :)
    - If you make improvements, please inform me!

    Example:

    // Setting operating hours
    // Key 0 is sunday, 1 is monday and so on
    var hours = [
        // Sunday
        {
            open: '08:00',
            close: '16:00'
        },

        // Monday
        {
            allday: true // Open all day
        },

        // Tuesday
        false, // Closed all day

        // Wednesday
        {
            open: '08:00',
            close: '16:00'
        },

        // Thursday
        {
            open: '08:00',
            close: '16:00'
        },

        // Friday
        {
            open: '08:00',
            close: '16:00'
        },

        // Saturday
        {
            open: '08:00',
            close: '16:00'
        },
    ];

    if(isOpen(hours)) {
        alert("We're open!");
    }
    else {
        alert("We're closed!");
    }
*/
function isOpen(hours) {
    var now = new Date();
    var today = now.getDay();

    var yesterday = today - 1;
    if(yesterday < 0) yesterday = 6;

    // Check today's opening hours
    if(hours[today]) {

        // It's open all day today
        if(hours[today].allday) {
            return true;
        }

        // Not open all day
        else {
            var open = hours[today].open;
            var close = hours[today].close;

            // Check if the location is open
            if(checkOpenHours(now,now,open,close)) {
                return true;
            }
        }

    }

    // Check yesterday's opening hours in case of closing after midnight
    if(hours[yesterday]) {

        // Not open all day (possibly closing after midnight)
        if(!hours[yesterday].allday) {
            var open = hours[today].open;
            var close = hours[today].close;

            var yesterday_date = new Date(now.getFullYear(), now.getMonth(), (now.getDate()-1), 0, 0, 0, 0);
            if(checkOpenHours(now,yesterday_date,open,close)) {
                return true;
            }
        }

    }

    // Not open
    return false;
}

/*
    Check if "now" is within operating hours
*/
function checkOpenHours(now, operatingDate, open, close) {
    // Splitting times to array
    var o = open.split(":");
    var c = close.split(":");

    // Hours not in proper format
    if(o.length < 2 || c.length < 2) {
        return false;
    }

    // Converting array values to int
    for(var i = 0; i < o.length; i++) {
        o[i] = parseInt(o[i]);
    }
    for(var i = 0; i < c.length; i++) {
        c[i] = parseInt(c[i]);
    }

    // Set opening Date()
    var od = new Date(operatingDate.getFullYear(), operatingDate.getMonth(), operatingDate.getDate(), o[0], o[1], 0, 0);

    // Set closing Date()
    var closingDay = operatingDate.getDate();

    // Closing after midnight, shift day to tomorrow
    if(o[0] > c[0]) {
        closingDay++;
    }
    var cd = new Date(operatingDate.getFullYear(), operatingDate.getMonth(), closingDay, c[0], c[1], 0, 0);

    // Is within operating hours?
    if(now > od && now < cd) {
        return true;
    }
    else return false;
}
于 2015-02-15T09:03:29.057 に答える
0

2つの配列が必要です:openingTimesとcloseingTimes。1番目のディメンションは季節、2番目のディメンションは曜日になります。次に、それはただです:

return ((time > openingTimes[season, dayOfWeek]) && (time < closingTimes[season, dayOfWeek]));
于 2013-01-22T21:53:22.487 に答える