设置 JS 条件以阻止"today"



更新:我一直在尝试几件事,这几乎是正确的...问题是,如果"今日"时间表没有空座位,它每天都会影响它。

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 返回新的时间值,而+将第二个值胁迫到一个数字。

最新更新