【问题标题】:Rounding times in time inputs to full hours or half-times将时间输入四舍五入为全小时或半时间
【发布时间】:2020-01-20 12:40:37
【问题描述】:

我需要:

XX:01 到 XX:14 向下舍入到 XX:00

XX:15 到 XX:29 向上舍入到 XX:30

XX:31 到 XX:44 向下舍入到 XX:30

XX:45 到 XX:59 向上舍入到 (XX+1):00

注意事项:

  1. 我在代码中只给出了两个案例,最终我有更多的案例
  2. 例如,我在代码中添加了未使用的附加输入,它们无效
  3. 他们必须自动检查是否已输入。

我的代码html:

<table>

<tr class="day"> 
  <td class="forUser1"><input type="time" class="start" id="start_1"></td>
  <td class="forUser2"><input type="time" class="end"  id="end_1"></td>
</tr>

<tr class="day">
  <td class="forUser1"><input type="time" class="start"  id="start_2"></td>
  <td class="forUser2"><input type="time" class="end" id="end_2"></td>
</tr>

</table>

我试过了:

funtion dist (parting) {
dist = parting.split(":");
const distDate = new Date(0, 0, 0, dist[0], dist[1], 0);
(...)
}


document.querySelector('table').addEventListener('change', function(e) {
  const classList = e.target.classList
  if (classList.contains('start') || classList.contains('end')) {

    const tr = e.target.parentNode.parentNode
    const [start, end] = [...tr.querySelectorAll('.start,.end')]
    (...)
  }
})

本以为这次应该分成单独的部分,但老实说我会想尽一切办法摆脱这种情况

【问题讨论】:

  • 所以您想在提交数据时将它们四舍五入,或者您想在输入时间时在输入本身中对其进行四舍五入?
  • 如果可以在输入时间的同时在输入中将其四舍五入
  • 在 RobG 在 cmets 中的建议的帮助下,如果分钟在 44 到 60 之间,我对 if 语句进行了小幅更改以将小时四舍五入。请检查新编辑的逻辑。

标签: javascript html date datetime


【解决方案1】:

您可以使用querySelectorAll() 方法获取所有输入元素,然后为每个输入元素添加一个change 侦听器,该侦听器将运行一个名为roundFunc 的函数,它将为您四舍五入数字,然后分配新的四舍五入的数字返回到输入值。

检查并运行以下代码片段或打开此JSBin 以获取上述方法的实际示例:

const timeInputs = document.querySelectorAll('table input.start, table input.end');

const roundFunc = e => {
  let x = e.target.value.split(':');
  if (x[1] > 00 && x[1] < 15) {
    x[1] = "00";
  } else if (x[1] > 44 && x[1] < 60) {
    x[0] = x[0] < 10 ? "0" + (parseInt(x[0]) + 1) : parseInt(x[0]) + 1;
    x[1] = "00";
  }
  else {
    x[1] = "30";
  }
  e.target.value = x.join(':');
}

timeInputs.forEach(input => {
    input.addEventListener('change', roundFunc);
});
<table>
  <tr class="day"> 
    <td class="forUser1"><input type="time" class="start" id="start_1"></td>
    <td class="forUser2"><input type="time" class="end"  id="end_1"></td>
  </tr>

  <tr class="day">
    <td class="forUser1"><input type="time" class="start"  id="start_2"></td>
    <td class="forUser2"><input type="time" class="end" id="end_2"></td>
  </tr>
</table>

但是,在提交数据时将其四舍五入会更简洁,因为最终用户不会因键入时数字的变化而感到困惑。当您准备好将数据发送到您的服务器时,要对数字进行四舍五入,您可以在提交数据之前运行上述函数roundFunc()

【讨论】:

  • @RobG 我并没有真正理解你的意思。您能否澄清您的评论,以便我可以相应地更新答案。
  • 或者更好的是,在这里添加它作为答案,如果我理解你的意思,我会支持它。
  • @RobG 没关系。我明白你的意思并更新了代码 sn-p。无论如何,请务必将其添加为答案,我会投票赞成。干杯。
  • @RobG 不太清楚您所说的“无法输入任何其他值……00 或 30 分钟”是什么意思。您能否为此添加更推荐的方法作为答案。
  • 另外,我用上面编辑的代码添加了一个 JSBin 链接到答案,输出结果对我来说似乎工作正常。
【解决方案2】:

它可能不是最优雅的,但它似乎工作:

let start = document.querySelector(".start");
start.addEventListener("change", roundTime);

/*
  01:00 .. 01:14 -> 01:00
  01:15 .. 01:44 -> 01:30
  01:45 .. 01:59 -> 02:00
*/
function roundTime(event) {
  let time = event.target.value.split(":");
  let hours = parseInt(time[0]);
  let mins = parseInt(time[1]);

  if (mins < 15) {
    mins = 0;
  } else if (mins < 45) {
    mins = 30;
  } else if (mins < 60) {
    mins = 0;
    hours = (hours + 1) % 24;
  }

  let rounded = [hours.toString().padStart(2, '0'), mins.toString().padStart(2, '0')].join(":");
  let result = document.querySelector(".result");
  event.target.value = rounded;
}
&lt;input type="time" class="start"&gt;

【讨论】:

  • 在保持该字段更新后,是否可以在同一字段(输入字段中的结果)中刷新它?
  • 是的,只需将结果分配给源 input 元素即可。查看更新的答案。
  • 这里是输入时的自动设置,我输入小时后无法输入分钟,我希望能够更改并且只有在进入另一个字段后才能更改(离开此字段)该值将四舍五入(我使用谷歌浏览器,我没有分钟和小时的栏)
  • 我在 FF 和 Chromium 中进行了尝试,我有单独的小时、分钟和 AM/PM 输入。只有在输入分钟后,更改才会生效。这听起来像你想要的。但它在您的浏览器和语言环境中的工作方式可能有所不同。可悲的是,我目前无法重现。另请参阅the MDN article on time input
  • 您可以尝试将事件类型从change 更改为input 达到您想要的结果。
猜你喜欢
  • 2021-09-30
  • 1970-01-01
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多