Используя Coldfusion, как определить, происходит ли данный промежуток времени в рабочее время (другой промежуток времени)? - PullRequest
0 голосов
/ 09 февраля 2010

Учитывая, что определенный бизнес открыт с 8 утра до 5 вечера, каков наилучший способ убедиться, что данный промежуток времени попадает в этот диапазон? Дата не имеет значения, просто нужно подтвердить, что весь запрошенный интервал времени находится в пределах рабочих часов.

Вот мои примерные данные, с которых я должен начать. (Здесь я использую cfscript просто для краткости)

<cfscript>
    // array of given timeslots to test
    timeslots = arrayNew(1);

    // 1st appointment, entirely within normal business hours
    appointment = structNew();
    appointment.begin = "10:00 AM";
    appointment.end = "2:00 PM";

    arrayAppend(timeslots, appointment);

    // 2nd appointment, outside of normal business hours
    appointment = structNew();
    appointment.begin = "7:00 PM";
    appointment.end = "9:00 PM";

    arrayAppend(timeslots, appointment);

    // 3rd appointment, kind of tricky, partly within business hours, still should fail
    appointment = structNew();
    appointment.begin = "3:00 PM";
    appointment.end = "6:00 PM";

    arrayAppend(timeslots, appointment);

    </cfscript>

Теперь я зациклюсь на этом массиве, запустив функцию проверки для каждой структуры. Для примера это может выглядеть так:

<cfoutput>
<cfloop array="#timeslots#" index="i">
    <!--- Should return 'true' or 'false' for each item --->
    #myValidator(i.begin, i.end)#<br />
</cfloop>
</cfoutput>

... Итак, вернемся к реальному вопросу ... как мне использовать Coldfusion, чтобы сравнить это время с данными часами работы?

<cfscript>
// if input data is outside of the internal time range, return false, otherwise true
function myValidator(begin, end) {
    var businessStart = "8:00 AM";
    var businessEnd = "5:00 PM";
    var result = false;

    // what kind of tests do I put here to compare the times?
}
</cfscript>

ОБНОВЛЕНИЕ: мое решение - переписать myValidator сверху на основе отзывов Бен Дум и Кевинка.

// checks if any scheduled events fall outside business hours
function duringBusinessHours(startTime, endTime) {
    var result = true;
    var busStart = 800;
    var busEnd = 1700;
    var startNum = 0;
    var endNum = 0;

    // convert time string into a simple number:
    // "7:00 AM" -> 700 | "3:00 PM" -> 1500
    startNum = timeFormat(arguments.startTime, "Hmm");
    endNum = timeFormat(arguments.endTime, "Hmm");

    // start time must be smaller than end time
    if (startNum GTE endNum) {
       result = false;

    // If start time is outside of business hours, fail
    } else if (startNum LT busStart OR startNum GT busEnd) {
       result = false;  

    // If end time is outside of business hours, fail
    } else if (endNum LT busStart OR endNum GT busEnd) {
       result = false;
    }
    return result;
}

Ответы [ 3 ]

1 голос
/ 09 февраля 2010

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

 <cfif arguments.startime LT bizStart OR arguments.endtime GT bizEnd>
   <cfreturn false>
 <cfelse>
   <cfreturn true>
 </cfif>
1 голос
/ 09 февраля 2010

Лично я бы создал два объекта даты с использованием CreateDateTime с одинаковыми значениями m / d / y и сравнил их, поскольку CF может сделать это правильно.

0 голосов
/ 10 февраля 2010

Вы определенно хотите создать объект даты / времени с CreateDateTime, а затем сравнить даты / периоды времени таким образом. Если вы взяли ввод как строку с веб-страницы, вы можете использовать ParseDateTime для преобразования строки, представляющей действительный формат даты / времени, в объект даты / времени.

...