【问题标题】:Does currentTime fall between 18:00 and 2:00currentTime 是否介于 18:00 和 2:00 之间
【发布时间】:2012-07-20 11:19:39
【问题描述】:

我有一个动态开盘和关盘时间的酒吧时间表,我必须计算 currentTime 是否在今天的开盘时间内。

问题是开放时间和关闭时间不在同一天。如何计算 currentTime 是否在多天的特定时间范围内?

我在这个项目上使用 jquery。

【问题讨论】:

  • 你的时代是什么格式?字符串?
  • +1 表示实际上使用了这样的用户名 lolol

标签: javascript jquery time


【解决方案1】:

如果你使用 new Date().getTime();这将返回自特定时间(恰好是 1970 年 1 月 1 日)以来的毫秒数。

如果您对开始和结束时间以及当前时间都这样做,如果您的当前时间介于开始和结束之间,那么它将大于开始毫秒并且小于结束毫秒。

只是一个注释,而不是Date().getTime();,你实际上可以像+new Date; 那样做,这是我从浏览网络中学到的东西。谷歌再次获胜:)。这是因为 + 本质上将日期转换为 int。

【讨论】:

  • 漂亮、简单、充满活力。 :-)
  • 你没有抓住重点。在某些情况下,截止日期时间应该是明天,因此您不能简单地将时间(2:00)转换为日期时间并检查当前时间是否在此之前。
  • @Sjoerd 嗯,你可以。时间戳考虑了日期,因此明天凌晨 2 点作为时间戳将大于今天凌晨 2 点,或者就此而言,今天的任何时间。
  • @user1487756 它古怪而且看起来很酷,但它显然更慢。我不是这方面的专家,只是觉得它很酷,所以把它包括在内。
  • @Sjoerd 哦,是的.. 看看这个Perf 对我来说慢了 34%,但是我学到了一些新东西 =)
【解决方案2】:

你可以使用 javascripts Date Object 来计算这个:

var start = new Date(2012,6,20,13).getTime();
var now = new Date().getTime();
var end = new Date(2012,6,21,2).getTime();

if( (start < now ) && (now < end )) {
  console.log("opened");
}
else {
 console.log("closed");
}

输出会打开到明天凌晨 2 点,然后输出关闭。

您可以查看此JSBin Example 并更改开始时间以查看其变化情况

【讨论】:

  • 有趣的是,给出完整解决方案的答案(意味着 OP 除了复制和粘贴外无事可做)是如何被接受的,而其他获得更多选票的答案,概述了完全相同的原则,在这些拼写出来的答案永远不会被接受之前发布。
【解决方案3】:

老实说,我对jquery一无所知,因此只能提供一般性建议。

订单是否“固定”? 如:第一场总是开场,第二场总是闭场?

如果是这样,答案很简单……当字段二小于字段一时,添加一个“特殊情况”。 而不是检查 'timestamp > openTime && timestamp

if(timestamp > openTime && timestamp <= Midnight || timestamp >= 0 && timestamp < closing time) {
     //Open/Close time
}

这有帮助吗?

更完整的代码示例可能是:

if((closeTime > openTime && timestamp > openTime && timestamp < closeTime) || //Normal time
(timestamp > openTime && timestamp < 86399) || //Before Midnight
(timestamp > 0 && timestamp < closeTime)) {    //After Midnight
    //Do Stuff
}

'closeTime' 你必须确保你总是检查正确的工作日,就像 Jon Taylor 已经说过的那样......但老实说,你可能最好使用他的解决方案。

或者,如果此规则适用于前一天的关闭时间,您必须检查,假设您的一天时间在午夜之后......并且在这个工作日的开放时间之前。

只是为了在代码中澄清这一点:

if(timestamp < openTime && openTimePrevDay > closeTimePrevDay && timestamp > closeTimePrevDay) {
    //Bar is open
}

明白我的意思吗?

【讨论】:

  • 为什么在时间戳中使用 or 大小写?你真的是指时间戳吗?如果是这样,那么更合适的方法是检查 tiestamp 是否介于 openTimestamp 和 closeTimeTimestamp 之间。
  • @JonTaylor 是的,我知道实际的 unix 时间戳是连续的,您当然是正确的。但按照我的理解,他不使用 Unix-Timestamps 来确定它是打开还是关闭,而是使用从 0 到 86400 的相对时间戳。
  • 好吧,我假设他正在使用某种日期/时间组合,否则他将不知道凌晨 2 点的关闭时间确实是明天还是后天或今天等。不幸的是,这意味着你的代码会在今天凌晨 2 点之前关闭他,而实际上他可能一直营业到今天早上 3 点,明天才凌晨 2 点。希望这有意义吗?我累了哈哈。
  • @JonTaylor 是的,我知道你的意思,虽然我猜他也可以......而不是使用真正的日期/时间组合,而是使用“周历”。在这种情况下,他会知道工作日,但不知道实际的 unix 时间戳。当然,我错过了关键点。等一下,让我编辑。
  • @JonTaylor 谢谢 :) 多亏了这个投票,我终于可以自己投票给你的答案了。因为,事实上,这是最适用的行为准则:)
【解决方案4】:

如果收盘时间早于开盘时间,则跨过一天,你要另外确定:

if (closingTime >= openingTime) {
    // Open during the day
    return currentTime >= openingTime && currentTime < closingTime;
} else {
    // Open across midnight
    return currentTime >= openingTime || currentTime < closingTime;
}

【讨论】:

    【解决方案5】:

    您可以查看MomentJS 库。它为日期和时间处理提供了一个不错的 API。

    【讨论】:

    • 不需要任何外部库,javascript 只需使用 tiemstamps 即可轻松处理。
    猜你喜欢
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 2012-06-21
    • 1970-01-01
    相关资源
    最近更新 更多