Невозможно передать строковую переменную в объект даты JS - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь передать строковую переменную в объект даты JS и создать дату в будущем.Это легко сделать следующим образом:

var d = new Date();
var year = d.getFullYear();
var month = d.getMonth();
var day = d.getDate();
var my_date = new Date(year + 1, month +1, day +1);

Но как я могу передать это с помощью строковой переменной, чтобы я мог добиться чего-то вроде этого:

var d = new Date();
var year = d.getFullYear();
var month = d.getMonth();
var day = d.getDate();
var my_variable = 'year + 1, month +1, day +1';
var my_date = new Date(my_variable);

В этом случае он возвращаетНеверная дата

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

К сожалению, javascript (и все языки, которые я знаю по своему усмотрению) не работают так.

Вместо этого вы можете использовать оператор eval, который позволяет создаватьВся инструкция в виде строки и запустить эту строку ...

var my_variable = 'year + 1, month +1, day +1';
eval('var my_date = new Date(' + my_variable + ');');

ОДНАКО использование eval опасно и может привести к неожиданным атакам.Используйте его только в случае крайней необходимости, и если вы уверены, что используемая строка является «безопасной»

0 голосов
/ 28 сентября 2018
Примечание

Вы должны быть немного осторожны с арифметикой дат, поскольку она не симметрична и может давать странные результаты, например, 29 февраля 2016 года + 1 год дает 1 марта 2017 года, а 31 июля минус 1 месяц равен 1Июль, поскольку нет 31 июня, он переносится на июль и т. Д.

Учитывая ваши исходные требования, вы можете рассмотреть синтаксический анализатор для вашего конкретного формата, например

function myParse(s, date) {
  date = date || new Date();
  // Default values object
  var values = {
    year:{sign:1, value:0}, month:{sign:1, value:0}, day:{sign:1, value:0}
  };
  // Tokenise string
  var part = s.toLowerCase().match(/[a-z]+|\d+|[+-]/ig);

  // Process the tokens
  if (part) {
    for (var i=0, iLen=part.length; i<iLen; i++) {
      if (part[i] in values) {
        values[part[i]].sign = part[i+1] == '+'? 1 : -1;
        values[part[i]].value = +part[i+2];
        i += 2;
      }
    }
  }
  // Apply to date
  date.setFullYear(
    date.getFullYear() + values.year.sign  * values.year.value,
    date.getMonth()    + values.month.sign * values.month.value,
    date.getDate()     + values.day.sign   * values.day.value
  );
  
  return date;
}

// Examples
var options = {day:'2-digit',month:'short',year:'numeric'};
console.log('Today is ' + (new Date().toLocaleString('en-gb', options)));

['year+1,month+1,day+1', // one of each
 'year+2,day+2',         // missing parameters
 'day  +  15, month +2', // any order, random whitespace
 'month - 3'             // subtraction

].forEach(function(s) {
  console.log(s + '\n' + myParse(s).toLocaleString('en-gb', options));
});

Это довольно терпимо, но вы должны проверить ввод.Он может быть расширен и для обработки времени, и для проблем на конец месяца, указанных выше.

0 голосов
/ 28 сентября 2018

Вы вставляете код Javascript в виде строки, что не имеет смысла для класса Date.

Вы можете хранить свои переменные в массиве, чтобы элегантно передавать их в Date.

const dates = [year + 1, month +1, day +1]
const my_date = new Date(...dates);

Я прочитал последующий комментарий, который указывает, что вы будете получать строки только от того места, откуда вы берете данные.Во-первых, если строка имеет формат «год + 1, месяц + 1, день + 1», это никогда не будет иметь смысла для объекта Date.Если строка состоит только из 3 чисел, разделенных запятой, вы можете разбить строку на запятые и передать их объекту Date таким же образом.

const dates = myString.split(',');
const my_date = new Date(...dates);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...