Перенаправить, если дата в URL позже текущего месяца - PullRequest
1 голос
/ 24 октября 2019

Я пытаюсь отобразить страницу, если текущая дата или текущая дата, читая URL текущих страниц и ища ключевые слова. Например,

Пример URL: http://www.website.com/blog/2019/october.html

Я хотел бы написать скрипт, который находит месяц («октябрь») и год (2019) из URL страницы и определяетесли это в настоящее время или в прошлом. Если это произойдет в будущем, он перенаправит их на страницу с ошибкой, текущая или прошлая пропустит их. Цель этого - предварительно опубликовать страницы, к которым я не хочу, чтобы пользователь мог иметь доступ до тех пор, пока они не станут текущим содержимым. значение в URL, затем сравните с массивом, используя цикл, чтобы получить номер месяца и года. Мой код на данный момент:

// Sample URL: http://www.website.com/blog/2019/october.html

var monthName = ["january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december"];
var monthNum = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];

for (i = 0; i < monthName.length; i++) {
    if (window.location.href.includes(monthName[i]) > 0) {
        var pageMonth = (monthNum[i]);
    }
    else {
    }
}

Это даст мне результат 10. Затем я собирался сделать то же самое с годом, затем сделать другое утверждение, которое объединит их в дату, затем использовать * 1011. * другой оператор, чтобы определить, что thatDate <= currentDate. Есть ли лучший способ выполнить это? </p>

Этот метод беспорядок, и мне кажется, что я могу упустить что-то, что облегчает достижение этого.

ОБНОВЛЕНИЕ: Спасибо за все ваши ответы. Я закончил свой код, который все еще предпочтителен, так как он не зависит от структуры URL-адреса, вместо этого он просто будет искать все это на случай, если мне понадобится переместить файлы или заставить эту работу где-то еще. Я думаю, что он определенно мог бы использовать некоторую очистку (особенно двухзначные разделы месяца), но я хотел опубликовать это здесь.

var d = new Date();
var monthTwoDigit = ("0" + (d.getMonth() + 1)).slice(-2);
var monthName = ["january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december"];
var monthNum = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"];

for (i = 00; i < monthName.length; i++) {
    if (window.location.href.includes(monthName[i]) > 0) {
        var pageMonth = monthNum[i];
    }
    else {
    }
}

for (i = 2019; i < 3000; i++) {
    if (window.location.href.includes(i) > 0) {
        var pageYear = (i);
    }
    else {
    }
}

var urlDate = "" + pageYear + pageMonth;
var actualDate = "" + d.getFullYear() + monthTwoDigit;

if (urlDate > actualDate) {
    window.location.replace("http://www.website.com/error.html");
}
else {
    document.write("SAFE");
}

Ответы [ 3 ]

2 голосов
/ 24 октября 2019

Да, этот код можно улучшить несколькими способами. Кроме того, для сравнения дат мы будем использовать экземпляр Date, который является встроенным в JS подходом для работы с датой и временем.

var monthName = ["january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december"];

Прежде всего, нам не нужно перечислять месяцчисла, потому что мы можем использовать индексы массива вышеупомянутого массива (от 0 до 11), это даст нам преимущество в будущем.

Теперь давайте проанализируем месяц и год по URL. Мы будем использовать регулярные выражения, чтобы писать меньше кода:

const matches = window.location.href.match(/http:\/\/www.website.com\/blog\/([0-9]{4})\/([a-z]{3,})\.html/);

// String.prototype.match, which we used can give us null value if URL doesn't match our pattern, so we need to check it first. 
if (matches !== null) {
  const year = parseInt(matches[0]); // the first match of regular expression is the year
  const monthIndex = monthName.indexOf(matches[1]); // this should give us the number of month, from 0 to 11
  if (monthIndex !== -1) { // but we must continue only if month name in the URL is correct.
    const date = new Date(); // Get current date.

    // Now let's extract month and year from the current date.
    // date.getMonth() returns the current number of month from 0 to 11, just what we need.
    // date.getFullYear() obviously returns the current year number.
    // Let's use these methods and compare current date values with ones we've got from the URL:

    if (date.getFullYear() > year || (date.getFullYear() === year && date.getMonth() > monthIndex)) {
      // we're in the future, let's redirect:
      window.location.href = 'https://website.com/error.html';
    }
  }
}
1 голос
/ 24 октября 2019

Я бы сделал это в значительной степени, как вы указали. Ясная, очевидная логика проще всего поддерживать.

function isFutureURL(url) {
  // Month name array
  let months = ["january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december"];

  // Parse the URL for the year and month
  let b = url.split(/\/|\./);
  let y = b[6];
  let m = months.indexOf(b[7]);

  // Set URL date to 00:00:00 at start of URL month
  let urlDate = new Date(y, m, 1);

  // Return true if test date is after current date
  // I.e. it's the first of next month or greater
  return urlDate > Date.now();
}

['http://www.website.com/blog/2018/april.html',
 'http://www.website.com/blog/2019/october.html',
 'http://www.website.com/blog/2020/may.html'
].forEach(sampleURL => 
  console.log(sampleURL + '\n is in the future? ' + isFutureURL(sampleURL))
);

Предполагается, что месяц и год всегда будут в одном и том же месте в URL-адресе. Возможно, вы захотите рассмотреть варианты, чтобы сделать их более устойчивыми (например, посмотрите на месяцимя и действительный год в любом месте URL).

Вы также можете выполнить некоторую проверку URL и значений y и m , чтобы пользователь не виделошибки.

0 голосов
/ 24 октября 2019

Используйте условие if

Например, пусть источник будет: http://www.website.com/blog/2019/october.html

Получить currMonthNo и curryear из

var d = new Date();

, а также получите srcMonthNo из sourceurl

Теперь проверьте

if(source.indexof(curryear) > -1 && currMonthNo <= srcMonthNo) {
  // Then return your conditional code
} else {
  // Return error message
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...