Функция времени, которая проверяет определенные дни - PullRequest
0 голосов
/ 29 июня 2018

У меня есть следующая функция времени, которую я использую для вывода, если бизнес открыт или закрыт. То, как я это запрограммировал, прекрасно работает в обычные рабочие недели. То, что я хочу сделать, это запрограммировать его на праздники, такие как Рождество, 4 июля и т. Д., Которые всегда в один и тот же день, поэтому на выходе видно, что мы закрыты.

Как бы я запрограммировал на фиксированные праздники?

function timeNow() {

    //Get time
    var d = new Date(),
    h = ('0' + d.getHours()).slice(-2),
    m = ('0' + d.getMinutes()).slice(-2);

    //Get Day
    new Date().getDay();
    var day = new Date().getDay();
    console.log(day);
    var operateDay = '';
    if (day >= 1 && day <= 5) {
        operateDay = true;
    } else if (day < 1 || day > 5) {
        operateDay = false;
    }

    // Checking time range
    var operatingTime = ((h >= 8 && h < 17) || (h === 8 && m == 0));
    var closedTime = (h >= 17 || h <= 8);
    var operateStatus = '';

    if ((operatingTime) && (operateDay = true)) {
        operateStatus = 'Our office is currently open';
        $('#closedWrap').addClass('block');
        $('#operationStatus').addClass('open');
    } else if (closedTime) {
        operateStatus = 'Our office is currently closed';
        $('#closedWrap').addClass('block');
        $('#operationStatus').addClass('closed');
    } else if (operateDay = false) {
        operateStatus = 'Our office is currently closed';
        $('#closedWrap').addClass('block');
        $('#operationStatus').addClass('closed');
    }

    return operateStatus;
}
var operation = timeNow();
$('#operationStatus').html(operation);

1 Ответ

0 голосов
/ 29 июня 2018

Я изменил вашу исходную функцию и создал исходную версию , которая обрабатывает пользовательский, легко «настраиваемый», понятный человеку список определенных праздников.

/**
 * Returns the office's open/closed state.
 *
 * @param {Date} [time] - A custom Date object to override the current time.
 * @returns {string} The state of the office (open or closed).
 */
function timeNow(time) {
  // Holidays - month-day format, it's adjusted for human-readability, so
  // January is 1, February is 2 ... December is 12
  var holidays = [
    '01-01', // New Year's Day
    '07-04', // Independence Day,
    '11-11', // Veterans Day
    '12-25', // Chirstmas
    '12-31', // New Year's Eve
  ];
  
  // Possibility of overriding the current date, if needed
  time = time || new Date();

  // Get time
  var d = time,
    h = ('0' + d.getHours()).slice(-2),
    m = ('0' + d.getMinutes()).slice(-2);

  // Get day
  var day = time.getDay();
  var operateDay = '';
  if (day >= 1 && day <= 5) {
    operateDay = true;
  } else if (day < 1 || day > 5) {
    operateDay = false;
  }
  
  // Checking time range
  var operatingTime = ((h >= 8 && h < 17) || (h === 8 && m == 0));
  var closedTime = (h >= 17 || h <= 8);
  var operateStatus = '';

  // Check against holidays if the store is seemingly open  
  // Since in JavaScipt's built-in Date object, January is 0, February is 1 ... December is 11,
  // to be humanly usable, add 1 to it, hence the name "adjusted"
  var adjustedMonth = time.getMonth() + 1;
  var dayOfMonth = time.getDate();
    
  if (operatingTime) {
    for (var i = 0, len = holidays.length, holiday, holidayMonth, holidayDay; i < len; i++) {
      // Process the specific holiday month-date format
      holiday = holidays[i].split('-');
      holidayMonth = parseInt(holiday[0], 10);
      holidayDay = parseInt(holiday[1], 10);
      
      // Check, whether today is a holiday ...
      if (adjustedMonth === holidayMonth && dayOfMonth === holidayDay) {
        // ...and if it is, then ...Hooray! Hooray! It's a Holi-Holiday
        operatingTime = false;
        closedTime = true;
        break;
      }      
    }
  }

  if ((operatingTime) && (operateDay = true)) {
    operateStatus = 'Our office is currently open';
    $('#closedWrap').addClass('block');
    $('#operationStatus').addClass('open');
  } else if (closedTime) {
    operateStatus = 'Our office is currently closed';
    $('#closedWrap').addClass('block');
    $('#operationStatus').addClass('closed');
  } else if (operateDay = false) {
    operateStatus = 'Our office is currently closed';
    $('#closedWrap').addClass('block');
    $('#operationStatus').addClass('closed');
  }

  return operateStatus;
}

// Testing
var shouldBeOpen = [
  '2018-06-25',
  '2018-06-26',
  '2018-06-27',
  '2018-06-28',
  '2018-06-29'
];

var shouldBeClosed = [
  '2018-01-01',
  '2018-07-04',
  '2018-11-11',  
  '2018-12-25',  
  '2018-12-31',
  '2019-01-01'
];

var STATUS_OPEN = 'Our office is currently open';
var STATUS_CLOSED = 'Our office is currently closed';

// converts a human-readable year-month-day to UTC date
function strToUtcDate(string) {
  var parts = string.split('-');
  var year = parts[0];
  var month = parts[1];
  var day = parts[2];  
  return new Date(Date.UTC(year, month - 1, day, 12, 0, 0));
}

shouldBeOpen.forEach(function (string) {
  var date = strToUtcDate(string);
  var status = timeNow(date);
  
  if (status === STATUS_OPEN) {
    console.log('opened, as it should on:', date);
  } else {
    console.log('closed, BUT IT SHOULD NOT ON:', date);
  }
});

shouldBeClosed.forEach(function (string) {
  var date = strToUtcDate(string);
  var status = timeNow(date);
  
  if (status === STATUS_CLOSED) {
    console.log('closed, as it should on:', date);
  } else {
    console.log('opened, BUT IT SHOULD NOT ON:', date);
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...