Мне нужно разделить две даты на отдельные значения - PullRequest
0 голосов
/ 08 октября 2019

Мне нужен JavaScript, чтобы разделить две даты, показанные как эта 08 Oct - 12 Oct 2019, на отдельные значения 10/08/2019 & 10/12/2019, когда я очищаю веб-сайт с помощью Apify.

Я начал использовать Apify, чтобы очистить некоторыеданные о событиях на местном театральном веб-сайте, чтобы я мог предоставить ту же информацию самостоятельно. Театральная компания записывает дату начала и окончания в одном теге абзаца, что означает, что она возвращает обе даты в одной ячейке.

Чтобы мой сайт использовал данные о датах театральных компаний, мне нужно отформатировать каждую дату следующим образом mm/dd/yyyy, и мне нужно, чтобы каждая дата была разделена на свои собственные значения. Есть ли способ с помощью javascript отделить даты в представленном примере и отформатировать их в американскую форму даты?

Например, это одна из страниц, на которых я собираю данные https://theatreroyal.com/whats-on/the-rocky-horror-show/

async function pageFunction(context) {
    const { request, log, jQuery } = context;

    const $ = jQuery;
    const title = $('title').text();

    log.info(`URL: ${request.url} TITLE: ${title}`);

    return {
        url: request.url,
        name: $('.c-pg-masthead-wrapper--events-fixed .c-pg-title').text(),
        date: $('.c-pg-masthead-wrapper--events-fixed .c-pg-subtitle').text().trim()
    };
}

В настоящее время вышеприведенный скрипт возвращает дату в том виде, как она написана, то есть 10 October - 12 Oct 2019, которая непригодна для того, что мне нужно.

Я был бы очень признателен за помощь. Заранее спасибо!

1 Ответ

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

Вот функция, которая будет возвращаться из и в

Я использовал

const format = { month: '2-digit', day: '2-digit', year: 'numeric' };

const getDates = (dateStr) => {
  [_, fd, fm, td, tm, year] = dateStr.match(/(\d{2}) ([a-zA-Z]{3}) - (\d{2}) ([a-zA-Z]{3}) (\d{4})/);
  const from = new Date(`${fd} ${fm} ${year} 15:00:00`); // using 15:00 for dst reasons
  const to   = new Date(`${td} ${tm} ${year} 15:00:00`);
  return {
    "from": from.toLocaleDateString("en-US", format),
      "to":   to.toLocaleDateString("en-US", format)
  }
};

const date = '08 Oct - 12 Oct 2019'; // change to your date string
const dates = getDates(date); // how to call it
console.log(dates.from, dates.to); // how to use the dates returned

Вот версия, которая может обрабатывать строки, которые пересекают годы

const format = { month: '2-digit', day: '2-digit', year: 'numeric' };

const getDates = (dateStr) => {
  const sameYear = dateStr.split(" ").length === 6; // dd mmm - dd mmm yyyy
  let fy="";
  if (sameYear) {
    [_, fd, fm, td, tm, year] = dateStr.match(/(\d{2}) ([a-zA-Z]{3}) - (\d{2}) ([a-zA-Z]{3}) (\d{4})/);
  }
  else {
    [_, fd, fm, fy, td, tm, year] = dateStr.match(/(\d{2}) ([a-zA-Z]{3}) (\d{4}) - (\d{2}) ([a-zA-Z]{3}) (\d{4})/);
  }
  const from = new Date(`${fd} ${fm} ${fy?fy:year} 15:00:00`); // using 15:00 for dst reasons
  const to   = new Date(`${td} ${tm} ${year} 15:00:00`);
  return {
    "from": from.toLocaleDateString("en-US", format),
      "to":   to.toLocaleDateString("en-US", format)
  }
};

const date1 = '08 Oct - 12 Oct 2019'; // change to your date string
const dates1 = getDates(date1); // how to call it
console.log(dates1.from, dates1.to); // how to use the dates returned

const date2 = '08 Dec 2019 - 12 Jan 2020'; // change to your date string
const dates2 = getDates(date2); // how to call it
console.log(dates2.from, dates2.to); // how to use the dates returned
...