javascript 下拉菜单 select 时间调节电流

javascript dropdown select time conditioned current

我的表单中有两个 select 字段:

对于MoFrselect间隔时间为09:00-17:00.
对于 Sa 区间是 09:00 - 14:00.
因为 Su 是 none.

如果今天是 Mo 并且当前时间是 11:17AM
-> 我希望 select 时间只能来自 12:00PM - 17:00.
如果今天是 Sa 并且当前时间是 13:00
-> 我希望 select 时间只能从 14:00 - 14:00.

如果今天是 29/11/2020 而我 select 1/12/2020
-> 我希望能够 select 时间间隔 09:00 - 17:00.

这在 javascript 和 on('change',function(){... 中可能吗?

       <div class="form-group">
        <label class="control-label" for="data_cmd">Dată ridicare*</label>
        <input id="data_cmd" type="date" class="form-control" data-date="" data-date-format="Y-m-d" name="data_cmd" placeholder="mm/dd/yyyy"/>
       </div>
       <div class="form-group">
        <label for="ora_ridicare">Ora ridicare*<br></label>
          <select class="form-control" type="text" id="ora_ridicare" name="ora_ridicare"/>
            <option value="">00:00</option>
            <?php
            for($hours=9; $hours<18; $hours++)
                for($mins=0; $mins<60; $mins+=60)
                    echo '<option>'.str_pad($hours,2,'0',STR_PAD_LEFT).':'
                                   .str_pad($mins,2,'0',STR_PAD_LEFT).'</option>';                
            ?>
          </select>
      </div>

  <div class="container contact">
  <form action="" method="post" id="form" enctype="multipart/form-data" accept-charset="iso-8859-2">
    <div class="contact-form">
      <div class="form-group">
        <label class="control-label" for="data_cmd">Dată ridicare*</label>
        <input id="data_cmd" type="date" class="form-control" data-date="" data-date-format="Y-m-d" name="data_cmd" placeholder="mm/dd/yyyy"/>
      </div>
      <div class="form-group">
        <label for="ora_ridicare">Ora ridicare*</label>
          <select class="form-control" type="text" id="ora_ridicare" name="ora_ridicare"/>
            <option value="">00:00</option>
            <?php
            for($hours=9; $hours<18; $hours++)
                for($mins=0; $mins<60; $mins+=60)
                    echo '<option>'.str_pad($hours,2,'0',STR_PAD_LEFT).':'
                                   .str_pad($mins,2,'0',STR_PAD_LEFT).'</option>';                
            ?>
          </select>
      </div>
      <div class="form-group">
        <div class="col-sm-offset-2">
          <button type="submit" class="btn btn-default" name="sendEmail">Trimite</button>
          <button type="reset" class="btn btn-secondary" value="Reset Button" onclick="document.location.reload();">Resetează</button>
        </div>
      </div>
      <div id="overlay" style="display:none;">
          <div class="spinner"></div>
          <br/>
          Loading...
      </div>
    </div>
  </form>
</div>

我的方法..

const myForm = document.forms['form-name']
const padHM = (h,m) => `${h.toString(10).padStart(2,'0')}:${m.toString(10).padStart(2,'0')}`
const DteRange=
    { Monday    : { first:'09:00', last:'17:00' }
    , Tuesday   : { first:'09:00', last:'17:00' }
    , Wednesday : { first:'09:00', last:'17:00' }
    , Thursday  : { first:'09:00', last:'17:00' }
    , Friday    : { first:'09:00', last:'17:00' }
    , Saturday  : { first:'09:00', last:'14:00' }
    , Sunday    : { first:'25:00', last:'' }
    }
  ;
// prepare Select named ora_ridicare
for( let hourX=9;hourX<19; ++hourX )
  for(minsX=0; minsX<60; minsX+=60)   // ?
    {
    let opt = new Option(padHM(hourX,minsX),padHM(hourX,minsX))
    opt.disabled = true
    myForm.ora_ridicare.add(opt)
    }


myForm.data_cmd.onchange = () =>
  {
  let dteDay = myForm.data_cmd.valueAsDate.toLocaleDateString('en-GB', { weekday: 'long' })

  myForm.ora_ridicare.querySelectorAll('option').forEach(opt =>
    {
    opt.disabled = opt.value < DteRange[dteDay].first || opt.value > DteRange[dteDay].last
    })
  myForm.ora_ridicare.value = '00:00' // reset on top..
  }
<form name="form-name">  <!-- use a form name !-->

  <!-- ... -->

  <div class="form-group">
    <label class="control-label" for="data_cmd">Dată ridicare*</label> 
    <input id="data_cmd" type="date" class="form-control" data-date="" data-date-format="Y-m-d" name="data_cmd" placeholder="mm/dd/yyyy"/>
  </div>
  
  <br>  <!-- just for more readable test-->

  <div class="form-group">
    <label for="ora_ridicare">Ora ridicare*<br></label>
    <select class="form-control" type="text" id="ora_ridicare" name="ora_ridicare"/>
      <option value="00:00" selected disabled>Choose hour : </option>
    </select>
  </div>

</form>

关于你问题的第二部分

If today is Mo and current time is 11:17AM
-> I want to be able to select time only from 12:00PM - 17:00.
If today is Sa an d current time is 13:00
-> I want to be able to select time only from 14:00 - 14:00.

If today is 29/11/2020 and I select 1/12/2020
-> I want to be able to select time interval 09:00 - 17:00.

只需更改我的这部分代码:

myForm.data_cmd.onchange = () =>
  {
  let inputDate = myForm.data_cmd.valueAsDate
    , dteDay    = inputDate.toLocaleDateString('en-GB', { weekday: 'long' })
    , h_First   = DteRange[dteDay].first 
    , h_Last    = DteRange[dteDay].last 
    , now_DT    = new Date()
    , todayDate = now_DT.toLocaleDateString('en-GB').split('/').reverse().join('-')
    , chooseDay = inputDate.toLocaleDateString('en-GB').split('/').reverse().join('-')
    ;
  if (chooseDay < todayDate) h_First = '25:00'
  if (chooseDay === todayDate)
    {
    let tim = now_DT.toLocaleTimeString('en-GB', { hour12: false, hour: '2-digit', minute: '2-digit' })
    if (tim > h_First) h_First = tim
    }
  myForm.ora_ridicare.querySelectorAll('option').forEach( opt =>
    {
    opt.disabled = opt.value < h_First || opt.value > DteRange[dteDay].last
    })
  myForm.ora_ridicare.value = '00:00' // reset on top..
  }

新版本(全JS)约

If current time is 9:30 I need to be able to select from list only from 11:00. If current time is 9:59, select 11:00. If current time is max 10:05, select 11:00, over 10:05, select 12:00.

希望您意识到我所做的非常出色 = Whosebug 不是提供免费代码的地方...

const myForm = document.forms['form-name']
  ,   _hhmm   = (h,m) => `${String(h).padStart(2,'0')}:${String(m).padStart(2,'0')}`
  ,   daysHours =
    { Monday    : { first:'09:00', last:'17:00' }
    , Tuesday   : { first:'09:00', last:'17:00' }
    , Wednesday : { first:'09:00', last:'17:00' }
    , Thursday  : { first:'09:00', last:'17:00' }
    , Friday    : { first:'09:00', last:'17:00' }
    , Saturday  : { first:'09:00', last:'14:00' }
    , Sunday    : { first:'25:00', last:''      }
    }
  ;
for( let hourX=9; hourX<19; ++hourX )  // prepare Select named ora_ridicare
  for(minsX=0; minsX<60; minsX+=60)   // ?
    {
    let opt      = new Option(_hhmm(hourX,minsX),_hhmm(hourX,minsX))
    opt.disabled = true
    myForm.ora_ridicare.add(opt)
    }

myForm.data_cmd.onchange =_=>
  {
  let inputDate = myForm.data_cmd.valueAsDate
    , in_Wday   = inputDate.toLocaleDateString('en-GB',{weekday:'long'})
    , hhmm_1st  = daysHours[in_Wday].first 
    , now_D_T   = new Date()
    , now_YMD   = now_D_T.toLocaleDateString('en-GB').split('/').reverse().join('-')    // change dd/mm/yyyy
    , in_YMD    = inputDate.toLocaleDateString('en-GB').split('/').reverse().join('-') //     to yyyy-mm-dd
    ;
  if (in_YMD < now_YMD) hhmm_1st = '25:00'
  if (in_YMD === now_YMD)
    {
    let [hh,mm] = now_D_T.toLocaleTimeString('en-GB',{hour12:false,hour:'2-digit',minute:'2-digit'}).split(':')
      , tim     = (mm > '05') ? _hhmm(+hh +2, 0) : _hhmm(+hh +1, 0)
      ;
    if (tim > hhmm_1st) hhmm_1st = tim
    }
  myForm.ora_ridicare.querySelectorAll('option').forEach( opt =>
    {
    opt.disabled = opt.value < hhmm_1st || opt.value > daysHours[in_Wday].last
    })
  myForm.ora_ridicare.value = '00:00' // reset on top..
  }