【问题标题】:JavaScript Dates: How do I compare the current date/time against a recurring event?JavaScript 日期:如何将当前日期/时间与重复事件进行比较?
【发布时间】:2014-12-27 19:10:54
【问题描述】:

假设我有一个在一周中同一天和同一时间发生的重复事件列表,例如周三下午 5:30 - 7:30。显然,我不想存储大量展望未来的日期字符串。存储这些数据的最佳方式是什么,以便我可以使用当前日期/时间对其进行测试。

我想根据事件是否在今天发生来过滤存储为 JSON 的事件列表。为了更进一步,我想测试一下活动是否尚未开始、目前正在进行或已完成。

这是我正在使用的数据类型的示例:

"schedule": [
  "wednesday": {
    "open": "5:30",
    "close": "7:30"
  },
  "thursday": {
    "open": "5:30",
    "close": "7:30"
  },
  "friday": {
    "open": "5:30",
    "close": "7:30"
  },
  "saturday": {
    "open": "3:30",
    "close": "4:30"
  },
  "sunday": {
    "open": "2:30",
    "close": "4:30"
  }
]

我知道Date.getDay(); 返回星期几的整数表示,所以也许我应该使用它而不是字符串表示。

当前模式需要从new Date 对象和每日计划中获取小时和分钟,并将它们一起比较。必须有更好的方法。

【问题讨论】:

  • 使用 24 小时制:17:30–19:30。这样,您可以在不使用 [AP]M 的情况下明确表示任何时间,并且可以将时间字符串解析为有效的 ISO 8601
  • @Roy 看看我的答案,这就是你要找的……测试一下。

标签: javascript datetime


【解决方案1】:

当您想使用 JSON 进行过滤时,看起来您有一个非常理想的格式。您可以使用以下命令返回当天的名称:

var d = new Date();
var weekday = ["Sunday", "Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
var n = weekday[d.getDay()];

最好让配置文件可读而不是易于编程。使用 24 小时时间,不必担心上午/下午的业务。

根据评论编辑:

var d = new Date();
var today = new Date(d.getFullYear(), d.getMonth(), d.getDate(), 0,0,0).getTime();
var time = d.getTime() - today; //today's time in miliseconds

【讨论】:

  • 对,那么我该如何将其与时间进行比较呢?我应该使用当前年/月/日构造一个新的日期对象并使用open 时间进行比较吗?
  • @Roy:见编辑。假设您想比较 open 和 close ,使用 24 小时格式是最简单的。 getTime() 返回 unix 时间。
【解决方案2】:

这就是您要测试的内容,只需将关闭时间更改为小于当前时间并观察它输出关闭而不是打开:

<script type="text/javascript">
var d = new Date();
var weekday = new Array(7);
weekday[0]=  "sunday";
weekday[1] = "monday";
weekday[2] = "tuesday";
weekday[3] = "wednesday";
weekday[4] = "thursday";
weekday[5] = "friday";
weekday[6] = "saturday";

var n = weekday[d.getDay()];
var schedule = {
    "wednesday": {
        "open": "5:30 AM",
        "close": "7:30 PM"
    },
    "thursday": {
        "open": "5:30 AM",
        "close": "7:30 PM"
    },
    "friday": {
        "open": "5:30 AM",
        "close": "7:30 PM"
    },
    "saturday": {
        "open": "3:30 AM",
        "close": "4:30 PM"
    },
    "sunday": {
        "open": "2:30 AM",
        "close": "4:30 PM"
    }
};
var dateString = "" + d.getFullYear() + "/" + (d.getMonth() + 1) + "/" + d.getDate();
var openDate = new Date(Date.parse((dateString + " " + schedule[n].open)));
var closeDate = new Date(Date.parse((dateString + " " + schedule[n].close)));
if((d >= openDate) && (d <= closeDate))
{
    window.alert("Open");
}
else
{
    window.alert("Closed");
}
</script>

这将创建 3 个日期对象 1. 当前日期和时间 (d) 2. 今天的打开日期和时间 (openDate) 3. 今天的关闭日期和时间 (closeDate)。然后它将当前日期和时间与其他 2 个日期和时间进行比较,以确保它在该范围内并输出“打开”。如果它不在范围内,它将输出“关闭”。

更新:

将日期转换为 UTC

window.alert("" + d.toUTCString());

【讨论】:

  • 如何处理时区?它是否默认为 UTC?
  • 以当地时间存储我的日期意味着如果用户来自不同的时区,我需要进行转换。谢谢,我会调查的。
  • 没问题,很高兴我能帮上忙!你能把它标记为正确吗?
猜你喜欢
  • 2017-05-15
  • 2017-05-04
  • 2016-07-24
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
  • 2015-03-14
  • 2013-01-16
  • 2011-11-14
相关资源
最近更新 更多