Застрял на увеличении даты - PullRequest
0 голосов
/ 18 декабря 2018

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

В настоящее время проблема заключается в том, что установленные переменные для даты не сохраняют значение даты в целом.IE, увеличивающийся с 12, 31, 2018, или в случае формата URL 20181231, должен привести к urlIncremented=20190101.1 января 2019 года, но результат моего кода: urlIncremented=20181232.

Конечный результат одного цикла, если он установлен на 8 июня 2018 года, должен быть: url20180608

У меня естьискал совет здесь и нашел файл JS с именем Date.JS, я импортировал его, и он выглядел многообещающе, но просто утешает часть своего кода, а именно:

function () {
   if (this._isSecond) {
        this._isSecond=false;
        return this;
   }
   if (this._same) {
        this._same=this._is=false;
        var o1=this.toObject(),
            o2=(arguments[0] || new Date()).toObject(), 
            v="",
            k=j.toLowerCase();
        for (var m=(px.length-1); m>-1; m--) { 
            v=px[m].toLowerCase();
            if (o1[v]!=o2[v]) { 
                return false;
            }
            if (k==v) { 
                break;
            }
        }
        return true;
   }
   if (j.substring(j.length-1)!="s") { 
       j+="s";
   }
   return this["add"+j](this._orient);
}

Просто головыдо Я еще не знаю JQuery, я просто играл с ним, чтобы посмотреть, поможет ли это ..

Вот мой фактический код.

 let url = "blank",
        firstRun = true;
    
    /* 
    function setDateByIncrement(currentSetDate){
      let newDate,
          currentDate = new Date(),
          day = currentDate.getDate()+1,
          month = currentDate.getMonth() + 1,
          year = currentDate.getFullYear();
    
      console.log(newDate);
      newDate = (year+month+day);
      console.log(newDate);
      return newDate;
    }
    */
    
    // use on First run to set the url and date.
    //3
    function setURL(){
      let urlIncremented = url + dateIncrementMethod();
      return urlIncremented;
    }
    
    // will open x number of new windows containing URL
    //2
    function grabOpenPDF(maxNumberDays){
      let urlSet = setURL();
      
      //Set the variable for max days.
      for(let x = 0; x < maxNumberDays; x++){
        //window.open(urlSet);
        console.log("It works: " + x);
        urlSet = setURL();
      }
    }
    
    /* TODO Add automatic download for MASS print.
    function downloadPDF(){
      
    }
    */
    
    //Starts the task. 
    //1
    function start(load){
      console.log("Current Address: " + url);
      if(load === 1){
        console.log("Event load active. ");
        let maxDay = document.querySelector('#maxNumberDays').value;;
        grabOpenPDF(maxDay);
      }else{
        console.log("Event load skip. ")
        let maxDay = document.getElementById('maxNumberDays').value;
        
      }
    }
    
    //4
    function dateIncrementMethod(current){
      let dateIncrement;
      if(firstRun=== true){
        var today = new Date($('#date-input').val());
        console.log("FirstRun check in 4. ")
      }
      firstRun = false;
      
      var tomorrow = today.add(1).day;
      console.log(tomorrow);
      
      return tomorrow;
    }
      /* Possibly Deprecated  
      //let dateIncrement;
          let date = new Date($('#date-input').val());
          console.log(date);
          day = date.getDate() + 1;
      if(firstRun === true){
          month = date.getMonth() + 1;
          year = date.getFullYear();
          //dateIncrement = (parseToAPI(year, month, day));
          firstRun = false;
          parseToAPI(year, month, day);
        }else{
          day = date.getDate()+1;
          parseToAPI(year, month, day);
        }
    }
    */
    function parseToAPI(year, month, day){
      let apiDate;
      console.log("Entered parse");
      this.day = day;
      this.month = month;
      let d = this.day.toString(),
          m = this.month.toString();
          if(d.length === 1){
            console.log("Entered First IF");
            this.day = ('0') + day;
            //console.log(day);
          }
          if(m.length === 1){
            console.log("Entered Second IF")
            this.month = ('0') + month;
          }
      apiDate = (year + "" + "" + month + "" + day);
      console.log(apiDate);
      return apiDate;
    }
<!DOCTYPE html>
<html>
<script src="https://code.jquery.com/jquery-2.0.3.js"></script>
<script src="https://doc-0k-6g-docs.googleusercontent.com/docs/securesc/77gdpvi38k94jj7nmfcm2n3tq7a0ifhu/ehjuusajghqnne5r2ncfvj30cmbll20p/1545105600000/17500114768188980350/17500114768188980350/1CDff-uWGahZX7aLt6WQfV1-R5PFHwiK8?e=download&nonce=52qkphatg2scm&user=17500114768188980350&hash=3uc9iql9m90vcrv3a7mhg8fdjce1b4fe.js"></script>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <title>JS Bin</title>
</head>
<body>
    <input type="date" id="date-input" required />
        <input type="maxNumberDays" id="maxNumberDays" max="31" required />
        <button id="startPDFApp" onClick="start()">Print PDFs</button>
        <button id="startPDFApp" onClick="start(1)">Load PDFs</button>
        <div id="info"></div>
    </body>
</html>

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Я не могу увеличить дату правильно.

Если у вас есть даты типа «20181231» с форматом YYYYMMDD, вы должны проанализировать их по частям даты, приращениюдень, затем отформатируйте его обратно в соответствующую строку.Может помочь библиотека манипулирования датами, или вы можете написать пользовательскую функцию.

Вы можете сделать это без генерации даты, но это немного больше кода и логики.

Например,

// Accept date string in format YYYYMMDD
// and return next date in same format
function getNextDate(s) {
  let z = n => ('0'+n).slice(-2);
  let [y, m, d] = s.match(/^\d{4}|\d{2}/g);
  let date = new Date(y, m-1, d);
  date.setDate(date.getDate() + 1);
  return date.getFullYear() + z(date.getMonth()+1) + z(date.getDate());
}

['20181230','20181231','20190101'].forEach(
  s => console.log(`${s} => ${getNextDate(s)}`)
);

Вы также можете использовать библиотеку, например moment.js:

function getNextDate(s) {
  return moment(s, 'YYYYMMDD')
           .add(1, 'day')
           .format('YYYYMMDD');
}



['20181230','20181231','20190101'].forEach(
  s => console.log(`${s} => ${getNextDate(s)}`)
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

Если вы используете moment.js для других целей, включите его.Но если это единственное свидание, для которого оно вам нужно, вам не нужны лишние накладные расходы.

0 голосов
/ 18 декабря 2018

Большая часть вашего кода немного неясна, и логика не очевидна в отношении того, что должно произойти.Вот что я мог бы просветить:

  1. Пользователь должен ввести дату, которая требуется
  2. Когда пользователь нажимает кнопку Загрузить PDF, список дат должен быть рассчитан
    • Предполагая, что сегодня до выбранной даты, максимум 31 день в будущем
  3. Сценарий проверяет, существует ли PDF для каждого из дней в списке

Я подозреваю, что вы просто искали способ создать шаблон для дней.У меня здесь может быть больше, чем нужно.

$(function() {
  function grabOpenPDF(end) {
    var current = new Date();
    end.setDate(end.getDate() + 1);
    var urls = [];
    while (current < end) {
      urls.push({
        name: $.datepicker.formatDate("yymmdd", current),
        url: "https://example.com/getpdf.php?date=" + $.datepicker.formatDate("yymmdd", current),
        hit: null
      });
      current.setDate(current.getDate() + 1);
    };
    console.log(urls);
    $.each(urls, function(k, v) {
      $.ajax({
        url: v.url,
        success: function(data) {
          v.hit = true;
          $("#info").append("<div>" + (k + 1) + ". " + v.url + ", hit: " + v.hit.toString() + "</div>");
        },
        error: function(data) {
          v.hit = false;
          $("#info").append("<div>" + (k + 1) + ". " + v.url + ", hit: " + v.hit.toString() + "</div>");
        }
      });
    });
  }

  var dtInp = $("#date-input").datepicker({
    dateFormat: "mm/dd/yy",
    maxDate: "+31d",
    minDate: new Date()
  });
  $(".today").html($.datepicker.formatDate("mm/dd/yy", new Date()));
  $("#printPDF").click();
  $("#startPDF").click(function(e) {
    e.preventDefault();
    $("#info").html("");
    if ($("#date-input").val() === "") {
      $("#date-input").focus();
      return false;
    }
    console.log("Event load active.");
    grabOpenPDF(dtInp.datepicker("getDate"));
  });
});
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script src="https://doc-0k-6g-docs.googleusercontent.com/docs/securesc/77gdpvi38k94jj7nmfcm2n3tq7a0ifhu/ehjuusajghqnne5r2ncfvj30cmbll20p/1545105600000/17500114768188980350/17500114768188980350/1CDff-uWGahZX7aLt6WQfV1-R5PFHwiK8?e=download&nonce=52qkphatg2scm&user=17500114768188980350&hash=3uc9iql9m90vcrv3a7mhg8fdjce1b4fe.js"></script>

<div class="ui-widget ui-widget-content" style="padding: 7px;">
  <p>From <span class="today">Today</span> until <input type="text" id="date-input" placeholder="mm/dd/yy" required style="border: 0; width: 8em; border-radius: 0; border-bottom: 1px solid #eee;" /></p>
  <button id="printPDF">Print PDFs</button>
  <button id="startPDF">Load PDFs</button>
  <div id="info"></div>
</div>

Как я уже говорил, вы можете использовать jQuery и jQuery UI, чтобы помочь вам.Взгляните: http://api.jqueryui.com/datepicker/

Когда пользователь нажимает на поле, он может выбрать дату между сегодняшним днем ​​и 31 днем ​​в будущем.затем они могут нажать кнопку «Загрузить PDF», и она будет захватывать PDF-файлы, повторяя каждый день и выполняя некоторые действия.

Хорошая справка для увеличения даты: Увеличение даты в JavaScript

Лично я бы отправил это на сервер вместо того, чтобы делать это в браузере.Предполагая, что есть БД в формате PDF, было бы быстрее отправить на сервер начальную и конечную дату, а затем выполнить запрос SELECT и вернуть результаты.Вы отправляете два бита данных на сервер и получаете список результатов в сравнении с поиском PDF-файлов в надежде найти свой гвоздь.используя приведенный выше пример, вы можете установить параметр minDate: "-6m" и просто ограничить диапазон, в котором пользователь может выбрать дату начала и окончания.

Надеюсь, это поможет.Не стесняйтесь комментировать и просить большей ясности, если это необходимо.

0 голосов
/ 18 декабря 2018

Хотя я не потратил достаточно времени на то, чтобы понять, что вы на самом деле пытаетесь сделать, похоже, что там много ненужного кода.Я оставлю это вам, чтобы расшифровать то, что вам нужно.

Я могу только выразить, что приведенный ниже код находится в промежуточном состоянии.Он включает в себя ряд изменений, большинство из которых я укажу, но я не хотел менять это слишком радикально, чтобы все выглядело чуждо.Так что даже приведенный ниже код нуждается в улучшении.

Существенные изменения включают в себя:

  1. Поскольку ваш URL-адрес увеличивается на единицу, вы можете использовать генератор функций,Внутри он увеличивает дату, вызывая setDate сам по себе, используя собственную дату + 1. Он также использует строковую функцию padStart, чтобы месяцы и дни всегда были двузначными.

  2. Избавление от переменной firstRun, так как она больше не нужна

  3. Внутри grabOpenPDF все, что вам нужно сделать, это получить следующее значение, возвращаемое функцией генератора URL

let URL_GEN = UrlGenerator('blank'),
  URL = URL_GEN.next().value;


//Starts the task. 
//1
function start(load) {
  let startDate = new Date(document.querySelector('#date-input').value)
  
  // overwrite global with values
  URL_GEN = UrlGenerator('blank', startDate)
  URL = URL_GEN.next().value
  
  console.log("Current Address: " + URL);
  if (load === 1) {
    console.log("Event load active.");
    let maxDay = document.querySelector('#maxNumberDays').value;
    grabOpenPDF(maxDay);
  } else {
    console.log("Event load skip.")
    let maxDay = document.getElementById('maxNumberDays').value;
  }
}

/* URL generator */
function* UrlGenerator(url, dt=new Date()) {
  while (true){
    yield url + dt.getFullYear() + (''+(dt.getMonth()+1)).padStart(2,'0') + (''+dt.getDate()).padStart(2,'0');
    
    // increase day for next iteration
    dt.setDate(dt.getDate()+1);
  }
}


// will open x number of new windows containing URL
function grabOpenPDF(maxNumberDays) {

  //Set the variable for max days.
  for (let i=0; i < maxNumberDays; i++) {
    console.log("It works: " + i, URL);
    URL = URL_GEN.next().value;
  }
}
<script src="https://doc-0k-6g-docs.googleusercontent.com/docs/securesc/77gdpvi38k94jj7nmfcm2n3tq7a0ifhu/ehjuusajghqnne5r2ncfvj30cmbll20p/1545105600000/17500114768188980350/17500114768188980350/1CDff-uWGahZX7aLt6WQfV1-R5PFHwiK8?e=download&nonce=52qkphatg2scm&user=17500114768188980350&hash=3uc9iql9m90vcrv3a7mhg8fdjce1b4fe.js"></script>
<input type="date" id="date-input" value="12/29/2018" required />
<input type="maxNumberDays" id="maxNumberDays" value="5" max="31" required />
<button id="startPDFApp" onClick="start()">Print PDFs</button>
<button id="startPDFApp" onClick="start(1)">Load PDFs</button>
<div id="info"></div>

Это может быть улучшено за счет лучшего управления глобальными переменными, более простым кодом (проще изложенным) и, возможно, улучшенными соглашениями об именах.Кроме того, в наши дни, как правило, нет нужды помещать обработчики событий непосредственно в HTML, вы можете динамически связывать эти события с помощью JavaScript.

...