感谢您查看此内容。 Javascript日期总是搞砸我。
我正在运行一个时间定义的事件,每周定义新的功能。在我的js中我有以下内容;
var challenge_start = new Date(2018,03,14);
var today = new Date(2018,4,1)
var int = new Date();
var weekNo = 0;
if(today<=int.setDate(challenge_start.getDate() + 7)) {
weekNo = 1;
}
if(today>int.setDate(challenge_start.getDate() + 7) && today< int.setDate(challenge_start.getDate() + 15)) {
weekNo = 2;
}
if(today>int.setDate(challenge_start.getDate() + 14) && today< int.setDate(challenge_start.getDate() + 22)) {
weekNo = 3;
}
if(today>int.setDate(challenge_start.getDate() + 21) && today< int.setDate(challenge_start.getDate() + 29)) {
weekNo = 4;
}
if(today>int.setDate(challenge_start.getDate() + 28) && today< int.setDate(challenge_start.getDate() + 36)) {
weekNo = 5;
}
if(today>int.setDate(challenge_start.getDate() + 35) && today< int.setDate(challenge_start.getDate() + 43)) {
weekNo = 6;
}
if(today>int.setDate(challenge_start.getDate() + 42) && today< int.setDate(challenge_start.getDate() + 49)) {
weekNo = 7;
}
console.log(weekNo);
&#13;
今天,我希望weekNo = 3,但我得到weekNo = 1。我在这里错过了什么?必须有更好的方法来做到这一点吗?
感谢您查看,
答案 0 :(得分:4)
我必须承认,我无法遵循您的逻辑以及您最终想知道的内容,但有一件事突然出现在我身上:您正在设置日期(setDate
)int
基于来自getDate
challenge_start
的{{1}}完全处于不同的月份(因为int
仅使用new Date()
初始化)。
如果我更改它,那么int
和challenge_start
最初的日期相同:
var int = new Date(challenge_start.getTime());
...您的代码会像您期望的那样返回3
:
var challenge_start = new Date(2018,03,14);
var today = new Date(2018,4,1)
var int = new Date(challenge_start.getTime());
var weekNo = 0;
if(today<=int.setDate(challenge_start.getDate() + 7)) {
weekNo = 1;
}
if(today>int.setDate(challenge_start.getDate() + 7) && today< int.setDate(challenge_start.getDate() + 15)) {
weekNo = 2;
}
if(today>int.setDate(challenge_start.getDate() + 14) && today< int.setDate(challenge_start.getDate() + 22)) {
weekNo = 3;
}
if(today>int.setDate(challenge_start.getDate() + 21) && today< int.setDate(challenge_start.getDate() + 29)) {
weekNo = 4;
}
if(today>int.setDate(challenge_start.getDate() + 28) && today< int.setDate(challenge_start.getDate() + 36)) {
weekNo = 5;
}
if(today>int.setDate(challenge_start.getDate() + 35) && today< int.setDate(challenge_start.getDate() + 43)) {
weekNo = 6;
}
if(today>int.setDate(challenge_start.getDate() + 42) && today< int.setDate(challenge_start.getDate() + 49)) {
weekNo = 7;
}
console.log(weekNo);
&#13;
如果<{strong> weekNo
是&#34;挑战开始和现在之间有多少周?&#34;那么最简单的事情可能只是得到两个日期之间的毫秒数除以一周的毫秒数,四舍五入(因为你似乎计算了部分周数):
var challenge_start = new Date(2018,03,14);
var today = new Date(2018,4,1); // I assume this is a stand-in for just `new Date()`
today.setHours(0, 0, 0); // Note making sure to get rid of the time (well, using midnight)
challenge_start.setHours(0, 0, 0); // Note the midnight thing again
var weekNo = Math.ceil((today - challenge_start) / (7 * 24 * 60 * 60 * 1000));
console.log(weekNo);
&#13;
这是有效的,因为JavaScript Date
将某一天视为完全 86400000(24 * 60 * 60 * 1000)毫秒。
答案 1 :(得分:1)
这应该相当容易计算,不需要查找。
从另一个日期中减去一个日期将获得两个日期之间的差异。将此除以每周的毫秒数(1000 * 60 * 60 * 24 * 7 = 604,800,000)将获得自开始日期以来的周数。
这与周数不同,因此将其向下舍入并添加1。
var challengeStart = new Date(2018,03,14);
var today = new Date(2018,4,1)
const weeksSince = (start, date) => {
const msPerWeek = 604800000;
return Math.floor((date - start) / msPerWeek) + 1
};
var weekNo = weeksSince(challengeStart, today);
console.log("Week No. " + weekNo);
答案 2 :(得分:1)
.getDate()
只返回当月的第n个 - 今天,它返回1.
您似乎想知道自challenge_start日期以来经过了多少个星期。 请尝试以下方法:
function getWeeksSince(date)
{
return Math.floor((new Date() - date) / 604800000); //604800000 is the amount of ms in a week
}
getWeeksSince(challenge_start); //2
这将在2-3周之间的任何时间返回2。 自4月14日(将于5月5日)过去3周后,它将立即返回3。
答案 3 :(得分:-1)
你为什么不这样做?:
var challenge_start = new Date(2018,03,14);
var today = new Date(); //2018,4,1
var int = weeksBetween(challenge_start, today).begon;
console.log((challenge_start - today) / (7 * 24 * 60 * 60 * 1000));
function weeksBetween(d1, d2) {
return {
past: Math.floor((d2 - d1) / (7 * 24 * 60 * 60 * 1000)),
begon: Math.ceil((d2 - d1) / (7 * 24 * 60 * 60 * 1000))
}
}
if (int < 1) alert("The Challenge has not started yet");
else if (int <= 7) {
alert("Currently your on week " + int + " of the challenge.");
switch(int) {
case 1:
alert("Time for some push-ups");
break;
case 2:
alert("Time for some jumping");
break;
case 3:
alert("Time for some ice-cream");
break;
case 4:
alert("Scream");
break;
case 5:
alert("Do some twerking");
break;
case 6:
alert("Hit an arrow");
break;
case 7:
alert("Stop using me");
break;
default:
console.error("Error: Week not found.")
}
} else alert("Challenge has ended");
答案 4 :(得分:-2)
TL; DR; - 你正在比较&#34; ticks&#34;而不是几天。
由于today
是一个Date对象,因此int.setDate()返回一个数字 - 确切地说是自纪元以来的刻度数。要进行比较,语言会根据&#34; 00:00:00&#34;将today
转换为多个刻度。
当我运行测试版时,我得到int.setDate(challenge_start.getDate() + 7) == 1526912465737
,其中today.valueOf() == 1525154400000
正如其他地方所建议的那样,你可以使用像我这样的二级库(我是sugar.js的特别粉丝)。或者,如果你想和#34;纯粹&#34; javascript,您可以使用一堆数学将这些刻度转换为天数。