2010-02-09 4 views
0

Учитывая, что определенный бизнес открыт с 8 до 17 часов вечера, как лучше всего проверить, что данный промежуток времени попадает в этот диапазон? Дата не имеет значения, просто нужно подтвердить, что весь запрошенный временной диапазон попадает в рабочее время.Использование Coldfusion, как определить, будет ли данный временной интервал в рабочее время (другой временной интервал)?

Вот мои данные для примера, которые я должен начать. (Я использую 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> 

UPDATE: мое решение - переписывание myValidator сверху на основе обратной связи Бен Гибели и kevink.

// 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; 
} 

ответ

1

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

<cfif arguments.startime LT bizStart OR arguments.endtime GT bizEnd> 
    <cfreturn false> 
<cfelse> 
    <cfreturn true> 
</cfif> 
+2

Возможно, вы захотите проверить, чтобы время окончания было после начала. В противном случае вы можете начать работу после закрытия (также после открытия) и завершить до открытия (также после закрытия). Ночные события должны потерпеть неудачу. –

+0

@Ben: Хорошие очки. @Kevin: Я обновил свой пример выше моим решением, используя вашу линию мышления. –

1

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

+0

Вы имеете в виду 4-х дневные объекты? два для входящих времени для сравнения и два для существующих рабочих часов. Хмм ... Я так понял. Просто кажется, что должен быть элегантный способ проверить временные рамки против других временных рядов. –

+0

Я не думаю, что преобразование в datetime является неэлегантным. Если вы хотите, чтобы ваш код сравнения был более чистым, вы всегда можете сворачивать свои собственные события с помощью cfc (я бы не стал называть его интервалом времени, опасаясь путаницы с createtimespan()). Но, в конце концов, вы, вероятно, просто скрываете код в слое абстракции, и если это единственное, что вы покупаете, я бы пропустил его. –

+0

Я не думаю, что эта логика гарантирует собственный cfc, но, вероятно, было бы полезно создать UDF по строкам timeSpanCollision (testStartTime, testEndTime, existingStartTime, existingEndTime, «overlap | collide»). Перекрытие будет полным перекрытием, тогда как столкновение будет только частично перекрываться. –

0

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

+0

Во время тестирования, поскольку у меня есть простая строка времени. Я обнаружил, что потребовалось больше времени, чтобы превратить временную строку в полный объект datetime и выполнить вычисления с использованием dateCompare (timeA, timeB, «n»), чем использовать timeFormat (timeString, «Hmm») и преобразовать в обычный номер, который мог бы сравниваться с GT и LT. –

+0

Однако, я использовал createDateTime(), который был громоздким. Я полностью забыл о ParseDateTime(), который был бы более идеален для этой цели. –

Смежные вопросы