将JS条件设置为阻止"今天"

时间:2017-09-21 04:31:27

标签: javascript ruby-on-rails date

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

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 %>

1 个答案:

答案 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 返回新的时间值,+会将第二个值强制转换为数字。