更新: 我一直在尝试一些事情,这几乎是正确的...问题在于,如果"今天"它会影响每一天。时间表没有空座位。
var toujitsu = waitings[0].split('-');
var waitingToujitsu = new Date(toujitsu);
var currentDate = new Date();
if (waitingToujitsu.getDate() === currentDate.getDate()) {
return [false, 'ui-state-disabled'];
}
ORIGINAL: 我目前正在一个处理餐厅预订的网站上工作,并为那些已经预订完毕的人提供等候名单。该网站是使用Rails制作的,但这个用户选择日期的日历使用以下JavaScript来确定等待列表的显示方式:
for (var i = 0; i < waitings.length; i++) {
var d = waitings[i].split('-');
var waiting = new Date(d[0], (d[1] - 1), d[2]);
if (waiting.getYear() == date.getYear() &&
waiting.getMonth() == date.getMonth() &&
waiting.getDate() == date.getDate()) {
if (<%= @restaurant.waiting_flag %>) {
return [true, 'ui-state-waiting'];
} else {
return [false, 'ui-state-disabled'];
}
}
}
过去的所有日期都是&#34;灰色&#34;并且无法选择。等待列表天数(当前已完全预订)显示为黑色,但可以选择。
我目前正在努力做的是制定一项规定,防止用户今天加入等候名单(从明天开始就可以了,但如果座位突然打开,今天加入太多问题了)
如果餐厅今天已经预订完毕,我需要使用return [false, 'ui-state-disabled'];
行,因为这会阻止用户在该日期做任何事情,但根本无法弄明白。
绝对会非常感谢任何帮助或建议!
&#34;的waitings&#34;来自这里:
beforeShowDay: function(date) {
var holidays = [];
var waitings = [];
<% cache @restaurant.id.to_s << "/#{I18n.locale.to_s}/" << @base_date.to_s << '/' << @seats.map(&:cache_key).join('/') do %>
<% 100.times do |f| %>
<% target_date = @base_date + f.days %>
<% unless active_seats(@seats, target_date).count == 0 %>
<% else %>
<% if RestaurantHoliday.is_restaurant_holiday?(@restaurant.id, target_date) %>
holidays.push('<%= target_date.strftime("%F")%>');
<% else %>
waitings.push('<%= target_date.strftime("%F")%>');
<% end %>
<% end %>
<% end %>
<% end %>
答案 0 :(得分:0)
如果您正在尝试查看特定日期字符串是否代表“今天”,那么您的问题归结为如何解析字符串并查看它是否为“今天”。这里肯定有答案,但是写一个新答案可能会更快,然后当我找到一个不错的副本时删除它。
您尚未提供任何样本输入,因此我不得不猜测。给出:
var toujitsu = waitings[0].split('-');
我假设waitings[0]
是一个时间戳,其值以“ - ”分隔,可能是“2017-09-23”。所以 split 将返回分配给 toujitsu 的数组,就好像通过:
var toujitsu = ['2017','09','23'];
然后有:
var waitingToujitsu = new Date(toujitsu);
当传递单个值时,Date构造函数按照ECMA-262中的描述处理它,也就是说它首先会看到它是否是Date对象。如果没有,它会将它强制转换为原语并从那里开始。
对于数组,它将使用 toString ,因此以上解析为:
var waitingToujitsu = new Date('2017,09,23');
几乎可以肯定(但不一定)返回无效的日期。您可能想要使用解构:
var waitingToujitsu = new Date(...toujitsu);
但目前不仅在网上不安全,它会将月份设置为错误值,因此请使用(假设为YYYY-MM-DD):
var waitingToujitsu = new Date(toujitsu[0], toujitsu[1]-1, toujitsu[2] );
将为主机时区中时间组件设置为00:00:00的给定值创建日期。然后:
var currentDate = new Date();
以毫秒精度为主机系统中的当前瞬间创建日期。因此,只有1:86,400,000的机会(与单一条目获胜的PowerBall大致相同)它将与 waitingToujitsu “相等”。
要进行比较,请将其时间设置为零,这可以通过一次调用 setHours 来完成,将小时,分钟,秒和毫秒设置为零:
currentDate.setHours(0,0,0,0);
现在您可以比较Date对象的时间值。您无法直接比较日期,因为它们是不同的对象,而==
和===
都会返回false。但您可以比较时间值,例如
if (waitingToujitsu.getTime() === currentDate.getTime()) {
/* the two dates are "equal" */
}
所以一个简单的功能可能是:
// See if date in format YYYY-MM-DD parsed as local
// is "today"
function isToday(s) {
// Create a Date from s
var b = s.split(/\D/);
var d = new Date(b[0], b[1]-1, b[2]);
// Create a date for 00:00:00 today
var n = new Date();
n.setHours(0,0,0,0);
// Return true if they're equal
return +d == +n;
}
Input date (yyyy-mm-dd)<input id="i0" value="2017-09-22"><br>
<button onclick="
console.log(isToday(document.getElementById('i0').value));
">Today?</button>
存在混淆的风险,该功能可以简化为:
function isToday(s) {
var b = s.split(/\D/);
return new Date().setHours(0,0,0,0) == +new Date(b[0], b[1]-1, b[2]);
}
鉴于 setHours 返回新的时间值,+
会将第二个值强制转换为数字。