【问题标题】:make function round up to nearest quarter hour使函数向上舍入到最接近的一刻钟
【发布时间】:2016-09-04 12:49:48
【问题描述】:

如何使函数四舍五入到最近的 15 分钟,而不是四舍五入? 如果是 10:46,它将舍入到 11:00

jsfiddle:https://jsfiddle.net/31L9d08s/

代码:

 var now = new Date();
    var Minutes = now.getMinutes();
    var quarterHours = Math.round(Minutes/15);
    if (quarterHours == 4)
    {
        now.setHours(now.getHours()+1);
    }
    var rounded = (quarterHours*15)%60;
    now.setMinutes(rounded);
    now.setSeconds(0);
    now.setMilliseconds(0);


    console.log(now.getTime());


    var currentdate = new Date(now.getTime()); 
    var datetime = "Last Sync: " + currentdate.getDate() + "/"
                    + (currentdate.getMonth()+1)  + "/" 
                    + currentdate.getFullYear() + " @ "  
                    + currentdate.getHours() + ":"  
                    + currentdate.getMinutes() + ":" 
                    + currentdate.getSeconds();


    console.log(datetime);

【问题讨论】:

  • 这比你上次问这个问题时好多了
  • 也就是说,我知道你之前被指向this question。当然,您的问题只是涉及这样做并增加 15 分钟?
  • 它涉及到,但没有四舍五入@T.J.Crowder
  • 因此是“加 15 分钟”
  • 我们可以和@T.J.Crowder 聊天吗?

标签: javascript jquery


【解决方案1】:

这个怎么样:

new Date(Math.ceil(new Date().getTime()/900000)*900000);

解释:new Date().getTime() 以 unix 时间戳的形式返回当前时间(即自 1970-01-01 00:00 UTC 以来的毫秒数),我们将其四舍五入为最接近的 900000 的倍数(即15 分钟内的毫秒数)在 Math.ceil 的帮助下。

编辑:如果您想将此应用于 15 分钟以外的间隔,您可以这样做(例如 30 分钟):

var interval = 30 * 60 * 1000; // 30 minutes in milliseconds
new Date(Math.ceil(new Date().getTime()/interval)*interval);

【讨论】:

  • 你可能需要补偿 timezoneOffset。
  • @Thomas:你为什么需要这样做?是否有任何时区不是 15 分钟的倍数?但是,如果您要四舍五入的时间不均匀,例如半小时,那将是一个好点。
  • 我认为@Thomas 实际上是对的。理论上,如果某个时区与 UTC 的偏移量不是 15 分钟的倍数,则上述方法将无法正常工作。
  • 你可以编辑它,这样我就可以做类似的事情:$int = 2;然后就是接下来的 30 分钟。 $int = 3;接下来 45 分钟,等等?
  • @TJCrowder,是的,不是的。在这种特殊情况下,您不必这样做,我想到了一个更通用的实现,其中“15 分钟”只是一个参数。
【解决方案2】:

以毫秒为单位传递您想要的任何周期以获得下一个周期示例 2、4、8 小时

function calculateNextCycle(interval) {
    const timeStampCurrentOrOldDate = Date.now();
    const timeStampStartOfDay = new Date().setHours(0, 0, 0, 0);
    const timeDiff = timeStampCurrentOrOldDate - timeStampStartOfDay;
    const mod = Math.ceil(timeDiff / interval);
    return new Date(timeStampStartOfDay + (mod * interval));
}

console.log(calculateNextCycle(4 * 60 * 60 * 1000)); // 4 hours in milliseconds

【讨论】:

    猜你喜欢
    • 2016-02-26
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    相关资源
    最近更新 更多