【问题标题】:How to create dynamic table based on start and end time values?如何根据开始和结束时间值创建动态表?
【发布时间】:2015-12-04 20:28:08
【问题描述】:

我有一个关于根据从一页传递到另一页的值创建动态表的问题。在第一页上,我定义了开始时间、结束时间和增量间隔。因此,在我选择开始时间后,让我们说上午 8:00 并选择会议长度 15 分钟,结束时间将根据开始时间以 15 分钟的间隔创建。示例结束时间:上午 8:15、上午 8:30、上午 8:45 等等,直到我最后一个不能大于晚上 9:00 的值。我可以为我的结束时间选择任何这些值。在我选择这三个值开始、结束和会议长度后,我点击提交,将我带到第二页。在此页面上,我想根据传递的值创建表。这是我到目前为止的代码:

<form name="myForm" id="myForm" method="post" action="SeconfPage.cfm">
        <fieldset>
            <table>
            <tr>
                <th>Date</th>
                <td><input type="date" id="datepicker" name="datepicker"/></td>
            </tr>
            <tr>
                <th>Start Time</th>
                <td><input type="text" id="stime" name="stime"/></td>
            </tr>
            <tr>
                <th>Length of meeting</th>
                <td>
                <select name="meeting" id="meeting">
                    <option value="">--Select length--</option>
                </select>
                </td>
            </tr>
            <tr>
                <th>End Time</th>
                <td><input type="text" id="etime" name="etime"></td>
            </tr>
            <tr>
                <td><input type="button" value="Create" onClick="getTable()"></td>
            </tr>
        </table>
    </fieldset>
</form>

$(function() {
        for (var i = 5; i <= 60; i += 5) {
            $('#meeting').append('<option value="' + i + '">' + i + '   min' + '</option>');
        }

        function setEndTime() {
            var meetingLength = parseInt($('#meeting').find('option:selected').val() || 0);
            var selectedTime = $('#stime').timepicker('getTime');
            if(selectedTime == null || selectedTime == ""){
                alert("Please select the start time");
            }else{
                selectedTime.setMinutes(selectedTime.getMinutes() + parseInt(meetingLength, 10), 0);
                $('#etime').timepicker('option', 'minTime', selectedTime);
                $('#etime').timepicker('setTime', selectedTime);
            }
        }

        $('#stime').timepicker({
            'timeFormat':'h:i a',
            'minTime': '8:00 AM',
            'maxTime': '9:00 PM',
            'step': 30
          }).on('changeTime', function () {
            setEndTime();
        });

        var count = 0;
        $('#etime').timepicker({
            'timeFormat':'h:i a' + ' (Slot '+count+')',
            'minTime': '8:00 AM',
            'maxTime': '9:00 PM',
            'step': function () {
                var val = parseInt($('#meeting').find('option:selected').val());
                count++
                return val;
            },

        });


        $('#meeting').bind('change', function () {
            setEndTime();
        });
    });

    function getTable(){
            document.myForm.submit();
    }

我试图弄清楚如何以及在第二页上创建表格的最佳方法是什么。所有值都是从我的表单传递的。例如在我的第二页:

start time: 8:00am
end time: 5:00pm
meeting length: 20min

我的想法是创建一个类似这样的 for 循环:

for(var i=stime; i<=etime; i+=meeting){
   var tbl = "<tr><td>"+stime+"-"+i+"</td></tr>"
}

这样的东西会给我开始时间和基于增量的下一个值。此外,一旦创建表,将此表存储在 MySQL 数据库中的最佳方法是什么?我仍然没有弄清楚如何让它工作。如果有人可以给我一个提示,最好的方法是什么,我是否走在正确的道路上。

提前致谢。

【问题讨论】:

  • (编辑)一旦创建表,将此表存储在 MySQL 数据库中的最佳方法是什么 只是我的 ¢,但这是您在设计用户界面。否则,前端可能最终决定了一个非常糟糕的数据库结构......我建议退后一步。把它分成几个步骤。首先为您的应用程序确定最佳数据库设计。然后在界面上工作,最后是查询。
  • 我仍在决定我应该走哪条路,在这种情况下什么是最有效的。感谢您的建议。
  • 如果您正在考虑使用整数来确定会议时间和持续时间,一种方法是使用 unix 时间。 Unix 时间在 java(ColdFusion 的底层引擎)以及 UTC 中都是相当标准的。但是,如果您的应用程序永远不会包含多个位置,这将引入更多的复杂性,这可能是不必要的。话虽如此,使用 unix 时间来存储您的时间/日期的优势在于它将是标准化/集中式的,您可以使用 Moment.js 等 UI 库将时间本地化到最终用户的位置。

标签: javascript jquery coldfusion


【解决方案1】:

请尝试以下方法(用于在第 2 页创建表格):

<cfscript>
  //existence and type checking
  param name="FORM.datepicker" type="date";
  param name="FORM.sTime" type="time";
  param name="FORM.eTime" type="time";
  param name="FORM.meeting" type="range" min=5 max=60;//minutes
  //create currentTimeSlotBegin and lastTimeSlotBegin for cfloop
  currentTimeSlotBegin = createDateTime(year(FORM.datepicker), month(FORM.datepicker), day(FORM.datepicker), hour(FORM.sTime), minute(FORM.sTime), 0);//this will be incremented, within cfloop, for each time slot
  lastTimeSlotEnd = createDateTime(year(FORM.datepicker), month(FORM.datepicker), day(FORM.datepicker), hour(FORM.eTime), minute(FORM.eTime), 0);//used only for creating lastTimeSlotBegin below
  lastTimeSlotBegin = dateAdd("n", FORM.meeting*-1, lastTimeSlotEnd);//subtract meeting length to get beginning of last time slot
</cfscript>
<table>
  <tr>
    <th>Time Slots for <cfoutput>#dateFormat(FORM.datepicker, "ddd, mmm dd, yyyy")#</cfoutput></th>
  </tr>
  <cfloop condition="currentTimeSlotBegin lte lastTimeSlotBegin">
    <cfset currentTimeSlotEnd = dateAdd("n", FORM.meeting, currentTimeSlotBegin)>
    <tr>
      <td><cfoutput>#timeFormat(currentTimeSlotBegin, "hh:nn tt")#-#timeFormat(currentTimeSlotEnd, "hh:nn tt")#</cfoutput></td>
    </tr>
    <cfset currentTimeSlotBegin = dateAdd("n", FORM.meeting, currentTimeSlotBegin)>
  </cfloop>
</table>

谢谢!,

-亚伦

【讨论】:

  • @AronNeff 我对这个 cfloop 条件有疑问。所以我试图把这个 放在另一个 里面。在我运行该代码后,我从第一个循环中获得了第一个 ID 的输出,之后什么也没有。出于某种原因,在我的循环尝试第二次之后,没有通过条件。你知道怎么解决吗?我试图在两个循环之间重置 cfloop 条件的值,但没有任何改变。
【解决方案2】:

这有点像您要找的吗,它是一个使用另一个表数据创建并填充的表

https://github.com/TheOriginalDeveloper/Dynamic-and-responsive-table

【讨论】:

  • 我正在查看您发送给我的这个链接,但这与我需要的不同。在我的情况下,首先我要做的是弄清楚如何转换时间值,然后我可以在 for 循环中使用时间值来创建值(时间范围),然后根据这些值构建表。
  • 尽量保持简单,尝试将其仅用作数字,但使用 if 语句来检测天气秒/分钟/小时达到 60 的值,然后在你之前增加 char知道我的意思吗?
  • 是的,您知道将时间值转换为数字的最佳方法是什么吗?会议长度值已经是一个整数。只是开始和结束时间我应该转换为数字。在我提交表单并在屏幕上输出 Form.value(s) 后,它们看起来像这样,例如:上午 8:30。
  • 尝试将用户输入限制为使用输入字段的数据时间类型,但我没有做任何这样的事情,然后我可以尝试解决问题,但最与我所做的类似的事情是一个 js 闹钟
  • @TheOriginal - 欢迎来到 S.O.您可能需要花一点时间查看Quick Tourguidelines。不鼓励(并且经常删除)仅包含链接的答案,因为当链接断开或更改时它们不再有用。考虑使用更多详细信息、代码示例等来扩展您的答案。
【解决方案3】:

我会做一些假设...在这些会议时段会发生一些事情,并且会议通常在时间在某个日期(因此只是一个日期时间在数据库表中)。

同意 Leigh 的观点,您想要做什么决定了数据结构,然后使用该查询来构建您的数据显示(在本例中为表格)。所以如果你最终需要存储的数据是

dateTimeStamp                 ¦ meetingID     ¦  meetingSlotData
{ts '2015-07-04 20:00:00'}    ¦ 1             ¦  Peter Pan
{ts '2015-07-04 20:15:00'}    ¦ 1             ¦  Wendy

首先使用您的日期时间选择器来填充数据表(现在只是手动完成)

 <cfset newQuery = queryNew("dateTimeStamp, meetingID, meetingSlotData","Timestamp, Integer, VarChar")>
 <cfset queryAddRow(newQuery, 2)>
 <cfset querySetCell(newQuery, "dateTimeStamp", {ts '2015-07-04 20:00:00'}, 1)>
 <cfset querySetCell(newQuery, "meetingID", 1, 1)>
 <cfset querySetCell(newQuery, "dateTimeStamp", {ts '2015-07-04 20:10:00'}, 2)>
 <cfset querySetCell(newQuery, "meetingID", 1, 2)>

 <cfdump var="#newQuery#">

然后查询数据来建表

<cfquery name="getMeeting">
    SELECT *
    FROM meetings
    WHERE id = 1
</cfquery>

<table>
<cfoutput query = "getMeeting">
    <tr><td>#dateTimeStamp#</td><td>#meetingID#</td></tr>
</cfoutput> 
</table>

【讨论】:

  • 我的问题是,如果我只使用这个带有一个时间变量的 dateTimeStamp,我将如何制作我需要的时间段?我不完全理解你在上面的代码中试图做什么。如果你能再解释一遍。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-26
  • 2021-09-22
  • 2010-11-22
  • 2019-02-13
  • 2020-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多