更新:我一直在尝试几件事,这几乎是正确的...问题是,如果"今日"时间表没有空座位,它每天都会影响它。
var toujitsu = waitings[0].split('-');
var waitingToujitsu = new Date(toujitsu);
var currentDate = new Date();
if (waitingToujitsu.getDate() === currentDate.getDate()) {
return [false, 'ui-state-disabled'];
}
原始:我目前正在一个网站上工作,该网站处理餐厅预订的候补名单,为那些已预订的人提供了候补名单。该网站是使用导轨制成的,但是此供食客选择日期的日历正在使用以下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'];
}
}
}
过去的所有日期都是"灰色的",无法选择。等待名单天(目前已预订)出现在黑色中,但可以选择。
我目前要做的是设定规定,以防止食客添加到今天的候补名单中(从明天开始是可以的,但是如果座位突然开放,今天就加入了太多问题)
如果餐厅的今天已预订,我需要使用return [false, 'ui-state-disabled'];
行,因为这可以防止用户在该日期做任何事情,但根本无法弄清楚。
绝对会非常感谢任何帮助或建议!
" waitings"来自这里:
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 %>
如果您要查看特定的日期字符串是否代表"今日",则您的问题归结为如何解析字符串,看看它是否为"今天"。肯定已经有了这里的答案,但是仅写一个新的答案可能会更快,然后在我找到一个不错的重复时将其删除。
您尚未提供任何示例输入,因此我必须猜测。给定:
var toujitsu = waitings[0].split('-');
我假设waitings[0]
是一个时间戳,其值由" - ",也许是" 2017-09-23"。因此, split 将返回分配给 toujitsu 的数组,就像以下内容:
var toujitsu = ['2017','09','23'];
然后有:
var waitingToujitsu = new Date(toujitsu);
传递单个值时,日期构造函数将按照ECMA-262中的描述进行处理,也就是说,它将首先查看它是否是日期对象。如果没有,它将将其胁迫到原始。
对于一个数组,它将使用 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的机会(与单个条目赢得强力球大致相同),它将"等于" 等待toujitsu 。
进行比较,将其时间设置为零,可以在一个呼叫中进行 sethours ,将小时,分钟,秒和毫秒设置为零:
currentDate.setHours(0,0,0,0);
现在您可以比较日期objets的时间值。您无法直接比较它们的对象,而==
和===
都将返回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 返回新的时间值,而+
将第二个值胁迫到一个数字。