Поменяй частицы если зима в javascript - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть две конфигурации (JSON) для частиц JS.Один из них предназначен для зимнего времени, поэтому он должен быть активен с 21 декабря по 21 марта.Я перепробовал много вещей, и все еще не работал (не потому, что все еще ноябрь :)) Последнее, что я пробовал, это

var today = new Date();
var tDate = today.getDate();
var tMonth = today.getMonth();

var startingDate = new Date();
var sDate = startingDate.setDate(1);
var sMonth = startingDate.setMonth(10);

var endingDate = new Date();
var eDate = endingDate.setDate(21);
var eMonth = endingDate.setMonth(2);

if (tMonth >= sMonth && tMonth <= eMonth) {
    if (tDate >= sDate && tDate <= eDate) {
        particlesJS.load('particles', '../../Content/Scripts/particles/particles-config-winter.json');
    }
}
else {
    particlesJS.load('particles', '../../Content/Scripts/particles/particles-config.json');
}

Это не имеет смысла, потому что дата начала и окончания оба - 21. Я пыталсясравнивать как строку, не получилось.Я понятия не имею, как сравнить две даты в JavaScript.Любая помощь?

Ответы [ 3 ]

0 голосов
/ 11 ноября 2018

манипулирование датами - это всегда борьба. Если вы не против библиотек справиться с этим, я бы посоветовал вам взглянуть на MomentJs , который упрощает манипулирование датой и временем. Однако в каждую библиотеку вы добавляете ненужный код, который вам может не понадобиться. Поэтому, если вам нужно всего лишь несколько манипуляций с датами, это может не стоить того, и trincot's s answer идеально, если вам не нужны MomentJ.

Следуя строке ответа Trincot, вы делаете то же самое в MomentJs:

function isWinter(date){
  date.year(moment().year()); //Normalize year.
  let winterStart = moment('21-12', 'DD-MM');
  let winterEnd = moment('21-03', 'DD-MM');
  return !date.isBetween(winterEnd, winterStart, 'day')
}
//Tests:
let today = moment('20-12', 'DD-MM');
alert(isWinter(today)); //false
today = moment('21-12', 'DD-MM');
alert(isWinter(today)); //true
today = moment('21-03', 'DD-MM');
alert(isWinter(today)); //true
today = moment('22-03', 'DD-MM');
alert(isWinter(today)); //false
today = moment('22-03-2019', 'DD-MM-YYYY');
alert(isWinter(today)); //false
today = moment('21-03-2019', 'DD-MM-YYYY');
alert(isWinter(today)); //true
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
0 голосов
/ 11 ноября 2018

Чтобы объяснить, почему ваш код не работает:

var today = new Date();
var tDate = today.getDate();
var tMonth = today.getMonth();

var startingDate = new Date();

// This sets the date to the first of the month, and sets sDate to a number
// that is the time value of the adjusted date
var sDate = startingDate.setDate(1);

// This sets the month to November and sMonth to the adjusted time value
var sMonth = startingDate.setMonth(10);

var endingDate = new Date();

// As above, this sets endingDate to 21 March and sets eDate and eMonth to numbers
var eDate = endingDate.setDate(21);
var eMonth = endingDate.setMonth(2);

// This will never be true after 1970-01-01 as you're comparing a months to a time values
if (tMonth >= sMonth && tMonth <= eMonth) {
  if (tDate >= sDate && tDate <= eDate) {

Даже если при этом использовались правильные значения, логика не работает, даже для даты в диапазоне, вы сравниваете дату (номер дня), когда ее следует сравнивать, только если месяц - март или ноябрь, ни один другой месяц (согласно ответу Trincot).

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

function isWinter(date = new Date()) {
  var start = new Date(date.getFullYear(), 2, 21);
  var end = new Date(date.getFullYear(), 11, 21);
  return date > start && date < end;
}

[new Date(2018, 0, 1), //  1 Jan 2018, winter
 new Date(2018, 2,21), // 21 Mar 2018, winter
 new Date(2018, 5, 1), //  1 Jun 2018, not winter
 new Date(2018,11,21), // 21 Dec 2018, winter
 new Date()            // Today ...
].forEach(d => console.log(`${d} is ${isWinter(d)?'not ':''}winter`));
0 голосов
/ 11 ноября 2018

Вы можете использовать эту функцию:

function isWinter(dt) {
    const m = dt.getMonth();
    return m == 11 ? dt.getDate() >= 21 : m == 2 ? dt.getDate() < 21 : m < 2;
}

Позвоните на сегодняшнюю дату так:

if (isWinter(new Date())) {  /*....*/ }

Одна из проблем в вашей попытке состоит в том, что методы setMonth и setDate возвращают измененную дату в виде количества миллисекунд (а не только части месяца или дня) и изменяют дату, в которую вызывается метод.

Объяснение функции:

В троичном выражении используется эта логика:

  • Если месяцем является декабрь (11), тогда верните true, если день месяца равен по крайней мере 21 или false в противном случае: это то, что dt.getDate() >= 21 оценивает (true или false).
  • В противном случае, если месяц - март (2), верните true, если день месяца меньше 21, или false в противном случае: тот же принцип, что и выше, но обратный
  • В противном случае вернуть true, если месяц наступает до марта (<2), и false в противном случае: это то, к чему <code>m < 2 относится.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...