Change particles if is winter in javascript
up vote
2
down vote
favorite
I have two configurations (json) for particles js. One of them is for winter time, so it should be active from 21. December to 21. March. I tried many things, and still not working (Not because is still November :) )
Last thing I tried is this
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');
}
This does not make sense, because starting and ending date is both 21. I tried to compare as string, didn't work out. I have no ideas how to compare two dates in javascript. Any help?
javascript date compare
add a comment |
up vote
2
down vote
favorite
I have two configurations (json) for particles js. One of them is for winter time, so it should be active from 21. December to 21. March. I tried many things, and still not working (Not because is still November :) )
Last thing I tried is this
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');
}
This does not make sense, because starting and ending date is both 21. I tried to compare as string, didn't work out. I have no ideas how to compare two dates in javascript. Any help?
javascript date compare
1
If you dont mind libraries to handle this for you, i would suggest you to look at momentJs which makes it easy to manipulate date and time.
– Lagoni
Nov 10 at 22:15
1
Wooow...I didn't even know that this exists. Can you put this as answer so I can mark it. Thank you very much!!!
– mr. Panzerman
Nov 10 at 22:19
add a comment |
up vote
2
down vote
favorite
up vote
2
down vote
favorite
I have two configurations (json) for particles js. One of them is for winter time, so it should be active from 21. December to 21. March. I tried many things, and still not working (Not because is still November :) )
Last thing I tried is this
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');
}
This does not make sense, because starting and ending date is both 21. I tried to compare as string, didn't work out. I have no ideas how to compare two dates in javascript. Any help?
javascript date compare
I have two configurations (json) for particles js. One of them is for winter time, so it should be active from 21. December to 21. March. I tried many things, and still not working (Not because is still November :) )
Last thing I tried is this
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');
}
This does not make sense, because starting and ending date is both 21. I tried to compare as string, didn't work out. I have no ideas how to compare two dates in javascript. Any help?
javascript date compare
javascript date compare
asked Nov 10 at 22:11
mr. Panzerman
698
698
1
If you dont mind libraries to handle this for you, i would suggest you to look at momentJs which makes it easy to manipulate date and time.
– Lagoni
Nov 10 at 22:15
1
Wooow...I didn't even know that this exists. Can you put this as answer so I can mark it. Thank you very much!!!
– mr. Panzerman
Nov 10 at 22:19
add a comment |
1
If you dont mind libraries to handle this for you, i would suggest you to look at momentJs which makes it easy to manipulate date and time.
– Lagoni
Nov 10 at 22:15
1
Wooow...I didn't even know that this exists. Can you put this as answer so I can mark it. Thank you very much!!!
– mr. Panzerman
Nov 10 at 22:19
1
1
If you dont mind libraries to handle this for you, i would suggest you to look at momentJs which makes it easy to manipulate date and time.
– Lagoni
Nov 10 at 22:15
If you dont mind libraries to handle this for you, i would suggest you to look at momentJs which makes it easy to manipulate date and time.
– Lagoni
Nov 10 at 22:15
1
1
Wooow...I didn't even know that this exists. Can you put this as answer so I can mark it. Thank you very much!!!
– mr. Panzerman
Nov 10 at 22:19
Wooow...I didn't even know that this exists. Can you put this as answer so I can mark it. Thank you very much!!!
– mr. Panzerman
Nov 10 at 22:19
add a comment |
3 Answers
3
active
oldest
votes
up vote
2
down vote
accepted
You could use this function:
function isWinter(dt) {
const m = dt.getMonth();
return m == 11 ? dt.getDate() >= 21 : m == 2 ? dt.getDate() < 21 : m < 2;
}
Call it for today's date like this:
if (isWinter(new Date())) { /*....*/ }
One of the issues in your attempt is that setMonth
and setDate
methods return the modified date as number of milliseconds (not just a month or day part) and mutate the date on which the method is called.
Explanation of the function:
The ternary expression uses this logic:
- If the month is December (11), then return true when the day-of-the-month is at least 21 or false otherwise: this is what
dt.getDate() >= 21
evaluates to (true or false). - Otherwise, if the month is March (2), then return true when the day-of-the-month is less than 21 or false otherwise: same principle as above, but reversed
- Otherwise, return true when the month comes before March ( < 2 ) and false otherwise: this is what
m < 2
evaluates to.
And you, dear sir, you are God. Work like a charm...
– mr. Panzerman
Nov 10 at 23:23
I know it works, I tried...but can you explain to me how. You lost me with two ternary operators... I've never seen it before...I tried to break it down to if statement so I can understand, but no luck for me...
– mr. Panzerman
Nov 10 at 23:54
1
I added an explanation in the answer.
– trincot
Nov 11 at 0:00
add a comment |
up vote
0
down vote
Date manipulation is always a struggle. If you don't mind libraries to handle this for you, i would suggest you to look at MomentJs which makes it easy to manipulate date and time. However each library you add, you add unnecessary code which you might not need. Therefore if you only need do a few date manipulations, it might not be worth it and trincot's's answer is perfect, if you don't really need MomentJs.
Following the line of trincot's answer, this is how you do the same thing in 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>
1
If today's date would be in January, then the ending date should not get its year increased, but the start date would need to get a year that is one less instead. NB: Winter does not start on 1 November ;-)
– trincot
Nov 10 at 23:52
We all know that winter begins on December 21 ... but I was too excited to check if this work, so I couldn't wait until then...that's why November... ;))
– mr. Panzerman
Nov 11 at 0:09
Yea, you right @trincot, will change it later :)
– Lagoni
Nov 11 at 0:12
A library recommendation is not an answer.
– RobG
Nov 11 at 11:28
@RobG you are right, that's why i suggested it in the comments on the post instead of creating it as an answer. Decided to do it any way, in case he wanted to go either way :) But i'll keep it in mind!
– Lagoni
Nov 11 at 11:33
add a comment |
up vote
0
down vote
To explain why your code doesn't work:
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) {
Even if this used correct values, the logic doesn't work as even for a date in the range, you're then comparing the date (day number) when that should only be compared if the month is March or November, not any other month (per Trincot's answer).
It's easier if you create dates for 21 March and 21 December in the current year, then see if the current date falls in the range. If it does, it's not winter. If it doesn't, it's winter. I've assumed that the range is inclusive, adjust the dates if that isn't the case.
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`));
add a comment |
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
2
down vote
accepted
You could use this function:
function isWinter(dt) {
const m = dt.getMonth();
return m == 11 ? dt.getDate() >= 21 : m == 2 ? dt.getDate() < 21 : m < 2;
}
Call it for today's date like this:
if (isWinter(new Date())) { /*....*/ }
One of the issues in your attempt is that setMonth
and setDate
methods return the modified date as number of milliseconds (not just a month or day part) and mutate the date on which the method is called.
Explanation of the function:
The ternary expression uses this logic:
- If the month is December (11), then return true when the day-of-the-month is at least 21 or false otherwise: this is what
dt.getDate() >= 21
evaluates to (true or false). - Otherwise, if the month is March (2), then return true when the day-of-the-month is less than 21 or false otherwise: same principle as above, but reversed
- Otherwise, return true when the month comes before March ( < 2 ) and false otherwise: this is what
m < 2
evaluates to.
And you, dear sir, you are God. Work like a charm...
– mr. Panzerman
Nov 10 at 23:23
I know it works, I tried...but can you explain to me how. You lost me with two ternary operators... I've never seen it before...I tried to break it down to if statement so I can understand, but no luck for me...
– mr. Panzerman
Nov 10 at 23:54
1
I added an explanation in the answer.
– trincot
Nov 11 at 0:00
add a comment |
up vote
2
down vote
accepted
You could use this function:
function isWinter(dt) {
const m = dt.getMonth();
return m == 11 ? dt.getDate() >= 21 : m == 2 ? dt.getDate() < 21 : m < 2;
}
Call it for today's date like this:
if (isWinter(new Date())) { /*....*/ }
One of the issues in your attempt is that setMonth
and setDate
methods return the modified date as number of milliseconds (not just a month or day part) and mutate the date on which the method is called.
Explanation of the function:
The ternary expression uses this logic:
- If the month is December (11), then return true when the day-of-the-month is at least 21 or false otherwise: this is what
dt.getDate() >= 21
evaluates to (true or false). - Otherwise, if the month is March (2), then return true when the day-of-the-month is less than 21 or false otherwise: same principle as above, but reversed
- Otherwise, return true when the month comes before March ( < 2 ) and false otherwise: this is what
m < 2
evaluates to.
And you, dear sir, you are God. Work like a charm...
– mr. Panzerman
Nov 10 at 23:23
I know it works, I tried...but can you explain to me how. You lost me with two ternary operators... I've never seen it before...I tried to break it down to if statement so I can understand, but no luck for me...
– mr. Panzerman
Nov 10 at 23:54
1
I added an explanation in the answer.
– trincot
Nov 11 at 0:00
add a comment |
up vote
2
down vote
accepted
up vote
2
down vote
accepted
You could use this function:
function isWinter(dt) {
const m = dt.getMonth();
return m == 11 ? dt.getDate() >= 21 : m == 2 ? dt.getDate() < 21 : m < 2;
}
Call it for today's date like this:
if (isWinter(new Date())) { /*....*/ }
One of the issues in your attempt is that setMonth
and setDate
methods return the modified date as number of milliseconds (not just a month or day part) and mutate the date on which the method is called.
Explanation of the function:
The ternary expression uses this logic:
- If the month is December (11), then return true when the day-of-the-month is at least 21 or false otherwise: this is what
dt.getDate() >= 21
evaluates to (true or false). - Otherwise, if the month is March (2), then return true when the day-of-the-month is less than 21 or false otherwise: same principle as above, but reversed
- Otherwise, return true when the month comes before March ( < 2 ) and false otherwise: this is what
m < 2
evaluates to.
You could use this function:
function isWinter(dt) {
const m = dt.getMonth();
return m == 11 ? dt.getDate() >= 21 : m == 2 ? dt.getDate() < 21 : m < 2;
}
Call it for today's date like this:
if (isWinter(new Date())) { /*....*/ }
One of the issues in your attempt is that setMonth
and setDate
methods return the modified date as number of milliseconds (not just a month or day part) and mutate the date on which the method is called.
Explanation of the function:
The ternary expression uses this logic:
- If the month is December (11), then return true when the day-of-the-month is at least 21 or false otherwise: this is what
dt.getDate() >= 21
evaluates to (true or false). - Otherwise, if the month is March (2), then return true when the day-of-the-month is less than 21 or false otherwise: same principle as above, but reversed
- Otherwise, return true when the month comes before March ( < 2 ) and false otherwise: this is what
m < 2
evaluates to.
edited Nov 11 at 0:00
answered Nov 10 at 22:28
trincot
113k1477109
113k1477109
And you, dear sir, you are God. Work like a charm...
– mr. Panzerman
Nov 10 at 23:23
I know it works, I tried...but can you explain to me how. You lost me with two ternary operators... I've never seen it before...I tried to break it down to if statement so I can understand, but no luck for me...
– mr. Panzerman
Nov 10 at 23:54
1
I added an explanation in the answer.
– trincot
Nov 11 at 0:00
add a comment |
And you, dear sir, you are God. Work like a charm...
– mr. Panzerman
Nov 10 at 23:23
I know it works, I tried...but can you explain to me how. You lost me with two ternary operators... I've never seen it before...I tried to break it down to if statement so I can understand, but no luck for me...
– mr. Panzerman
Nov 10 at 23:54
1
I added an explanation in the answer.
– trincot
Nov 11 at 0:00
And you, dear sir, you are God. Work like a charm...
– mr. Panzerman
Nov 10 at 23:23
And you, dear sir, you are God. Work like a charm...
– mr. Panzerman
Nov 10 at 23:23
I know it works, I tried...but can you explain to me how. You lost me with two ternary operators... I've never seen it before...I tried to break it down to if statement so I can understand, but no luck for me...
– mr. Panzerman
Nov 10 at 23:54
I know it works, I tried...but can you explain to me how. You lost me with two ternary operators... I've never seen it before...I tried to break it down to if statement so I can understand, but no luck for me...
– mr. Panzerman
Nov 10 at 23:54
1
1
I added an explanation in the answer.
– trincot
Nov 11 at 0:00
I added an explanation in the answer.
– trincot
Nov 11 at 0:00
add a comment |
up vote
0
down vote
Date manipulation is always a struggle. If you don't mind libraries to handle this for you, i would suggest you to look at MomentJs which makes it easy to manipulate date and time. However each library you add, you add unnecessary code which you might not need. Therefore if you only need do a few date manipulations, it might not be worth it and trincot's's answer is perfect, if you don't really need MomentJs.
Following the line of trincot's answer, this is how you do the same thing in 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>
1
If today's date would be in January, then the ending date should not get its year increased, but the start date would need to get a year that is one less instead. NB: Winter does not start on 1 November ;-)
– trincot
Nov 10 at 23:52
We all know that winter begins on December 21 ... but I was too excited to check if this work, so I couldn't wait until then...that's why November... ;))
– mr. Panzerman
Nov 11 at 0:09
Yea, you right @trincot, will change it later :)
– Lagoni
Nov 11 at 0:12
A library recommendation is not an answer.
– RobG
Nov 11 at 11:28
@RobG you are right, that's why i suggested it in the comments on the post instead of creating it as an answer. Decided to do it any way, in case he wanted to go either way :) But i'll keep it in mind!
– Lagoni
Nov 11 at 11:33
add a comment |
up vote
0
down vote
Date manipulation is always a struggle. If you don't mind libraries to handle this for you, i would suggest you to look at MomentJs which makes it easy to manipulate date and time. However each library you add, you add unnecessary code which you might not need. Therefore if you only need do a few date manipulations, it might not be worth it and trincot's's answer is perfect, if you don't really need MomentJs.
Following the line of trincot's answer, this is how you do the same thing in 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>
1
If today's date would be in January, then the ending date should not get its year increased, but the start date would need to get a year that is one less instead. NB: Winter does not start on 1 November ;-)
– trincot
Nov 10 at 23:52
We all know that winter begins on December 21 ... but I was too excited to check if this work, so I couldn't wait until then...that's why November... ;))
– mr. Panzerman
Nov 11 at 0:09
Yea, you right @trincot, will change it later :)
– Lagoni
Nov 11 at 0:12
A library recommendation is not an answer.
– RobG
Nov 11 at 11:28
@RobG you are right, that's why i suggested it in the comments on the post instead of creating it as an answer. Decided to do it any way, in case he wanted to go either way :) But i'll keep it in mind!
– Lagoni
Nov 11 at 11:33
add a comment |
up vote
0
down vote
up vote
0
down vote
Date manipulation is always a struggle. If you don't mind libraries to handle this for you, i would suggest you to look at MomentJs which makes it easy to manipulate date and time. However each library you add, you add unnecessary code which you might not need. Therefore if you only need do a few date manipulations, it might not be worth it and trincot's's answer is perfect, if you don't really need MomentJs.
Following the line of trincot's answer, this is how you do the same thing in 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>
Date manipulation is always a struggle. If you don't mind libraries to handle this for you, i would suggest you to look at MomentJs which makes it easy to manipulate date and time. However each library you add, you add unnecessary code which you might not need. Therefore if you only need do a few date manipulations, it might not be worth it and trincot's's answer is perfect, if you don't really need MomentJs.
Following the line of trincot's answer, this is how you do the same thing in 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>
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>
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>
edited Nov 11 at 2:30
answered Nov 10 at 22:39
Lagoni
14812
14812
1
If today's date would be in January, then the ending date should not get its year increased, but the start date would need to get a year that is one less instead. NB: Winter does not start on 1 November ;-)
– trincot
Nov 10 at 23:52
We all know that winter begins on December 21 ... but I was too excited to check if this work, so I couldn't wait until then...that's why November... ;))
– mr. Panzerman
Nov 11 at 0:09
Yea, you right @trincot, will change it later :)
– Lagoni
Nov 11 at 0:12
A library recommendation is not an answer.
– RobG
Nov 11 at 11:28
@RobG you are right, that's why i suggested it in the comments on the post instead of creating it as an answer. Decided to do it any way, in case he wanted to go either way :) But i'll keep it in mind!
– Lagoni
Nov 11 at 11:33
add a comment |
1
If today's date would be in January, then the ending date should not get its year increased, but the start date would need to get a year that is one less instead. NB: Winter does not start on 1 November ;-)
– trincot
Nov 10 at 23:52
We all know that winter begins on December 21 ... but I was too excited to check if this work, so I couldn't wait until then...that's why November... ;))
– mr. Panzerman
Nov 11 at 0:09
Yea, you right @trincot, will change it later :)
– Lagoni
Nov 11 at 0:12
A library recommendation is not an answer.
– RobG
Nov 11 at 11:28
@RobG you are right, that's why i suggested it in the comments on the post instead of creating it as an answer. Decided to do it any way, in case he wanted to go either way :) But i'll keep it in mind!
– Lagoni
Nov 11 at 11:33
1
1
If today's date would be in January, then the ending date should not get its year increased, but the start date would need to get a year that is one less instead. NB: Winter does not start on 1 November ;-)
– trincot
Nov 10 at 23:52
If today's date would be in January, then the ending date should not get its year increased, but the start date would need to get a year that is one less instead. NB: Winter does not start on 1 November ;-)
– trincot
Nov 10 at 23:52
We all know that winter begins on December 21 ... but I was too excited to check if this work, so I couldn't wait until then...that's why November... ;))
– mr. Panzerman
Nov 11 at 0:09
We all know that winter begins on December 21 ... but I was too excited to check if this work, so I couldn't wait until then...that's why November... ;))
– mr. Panzerman
Nov 11 at 0:09
Yea, you right @trincot, will change it later :)
– Lagoni
Nov 11 at 0:12
Yea, you right @trincot, will change it later :)
– Lagoni
Nov 11 at 0:12
A library recommendation is not an answer.
– RobG
Nov 11 at 11:28
A library recommendation is not an answer.
– RobG
Nov 11 at 11:28
@RobG you are right, that's why i suggested it in the comments on the post instead of creating it as an answer. Decided to do it any way, in case he wanted to go either way :) But i'll keep it in mind!
– Lagoni
Nov 11 at 11:33
@RobG you are right, that's why i suggested it in the comments on the post instead of creating it as an answer. Decided to do it any way, in case he wanted to go either way :) But i'll keep it in mind!
– Lagoni
Nov 11 at 11:33
add a comment |
up vote
0
down vote
To explain why your code doesn't work:
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) {
Even if this used correct values, the logic doesn't work as even for a date in the range, you're then comparing the date (day number) when that should only be compared if the month is March or November, not any other month (per Trincot's answer).
It's easier if you create dates for 21 March and 21 December in the current year, then see if the current date falls in the range. If it does, it's not winter. If it doesn't, it's winter. I've assumed that the range is inclusive, adjust the dates if that isn't the case.
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`));
add a comment |
up vote
0
down vote
To explain why your code doesn't work:
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) {
Even if this used correct values, the logic doesn't work as even for a date in the range, you're then comparing the date (day number) when that should only be compared if the month is March or November, not any other month (per Trincot's answer).
It's easier if you create dates for 21 March and 21 December in the current year, then see if the current date falls in the range. If it does, it's not winter. If it doesn't, it's winter. I've assumed that the range is inclusive, adjust the dates if that isn't the case.
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`));
add a comment |
up vote
0
down vote
up vote
0
down vote
To explain why your code doesn't work:
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) {
Even if this used correct values, the logic doesn't work as even for a date in the range, you're then comparing the date (day number) when that should only be compared if the month is March or November, not any other month (per Trincot's answer).
It's easier if you create dates for 21 March and 21 December in the current year, then see if the current date falls in the range. If it does, it's not winter. If it doesn't, it's winter. I've assumed that the range is inclusive, adjust the dates if that isn't the case.
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`));
To explain why your code doesn't work:
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) {
Even if this used correct values, the logic doesn't work as even for a date in the range, you're then comparing the date (day number) when that should only be compared if the month is March or November, not any other month (per Trincot's answer).
It's easier if you create dates for 21 March and 21 December in the current year, then see if the current date falls in the range. If it does, it's not winter. If it doesn't, it's winter. I've assumed that the range is inclusive, adjust the dates if that isn't the case.
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`));
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`));
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`));
answered Nov 11 at 12:04
RobG
95.9k19101143
95.9k19101143
add a comment |
add a comment |
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53243936%2fchange-particles-if-is-winter-in-javascript%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
If you dont mind libraries to handle this for you, i would suggest you to look at momentJs which makes it easy to manipulate date and time.
– Lagoni
Nov 10 at 22:15
1
Wooow...I didn't even know that this exists. Can you put this as answer so I can mark it. Thank you very much!!!
– mr. Panzerman
Nov 10 at 22:19