为什么这种获取带有时间戳的过去日期的算法不起作用



在stackoverflow上,我发现了一种非常好且简单的方法,可以使用模计算带有时间戳的过去日期

var timestampNow = moment().valueOf(); //get timestamp in miliseconds of current date and time
var interval1H = 60 * 60 * 1000; //this is 1 hour in miliseconds
var timestampMinus3Days = timestampNow - (timestampNow % (interval1H*24*3)); //substracts the modulo from current timestamp
alert("Calculated time: " + moment(timestampMinus3Days).format("DD.MM.YYYY HH.mm.ss"))

但是可变时间戳Minus3Days并没有给我3天前的日期。目前,我正在写这篇文章,它给了我4月20日星期一凌晨00:00。

我百分之百确信这在其他约会中也适用。但模计算似乎不起作用,也许是在这个特定的日期。

有人解释过吗?如何改进代码?

你能把它改成吗

var timestampMinus3Days = timestampNow - (interval1H*24*3);

简单的答案是,如果您使用的是moment.js,那么请将其用于整个计算(见下文(。

你的减去3天的算法不起作用,因为算法是错误的。OP代码的"工作"版本在底部。给定:

var timestampMinus3Days = timestampNow - (timestampNow % (interval1H * 24 * 3)); 

其中时间戳Now是ECMAScript时间值,间隔1H为3.6e6 ms。

时间值是自1970-01-01 UTC(ECMAScript epoch(以来的毫秒,%是余数运算符,它类似于模,但不完全相同。

表达式timestampNow % (interval1H*24*3)将自epoch以来的时间除以3天并得到余数,因此您将新日期设置为1970年1月1日起3天的整数倍,而不是3天前。因此,每3天计算一次,将返回3天前的日期,另外两天将返回1或2天前的日期。

剩余部分还包括当天的UTC时间,因此如果您的时区是00:00:00,则必须是+0(GMT或UTC(。其他人将获得与其时区偏移量相等的时间,如果他们与UTC的偏移量为负,则将获得前一天的日期。

以下是如何使用moment.js并避免干扰时间值:

// 3 days ago from now
console.log(moment().subtract(3, 'days').format('DD.MM.YYYY HH.mm.ss'));
// 3 days ago at the start of the day
console.log(moment().subtract(3, 'days').startOf('day').format('DD.MM.YYYY HH.mm.ss'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

OP代码的工作版本:

var timestampNow = moment().valueOf();
var interval1H = 60 * 60 * 1000;
var timestampMinus3Days = timestampNow - (timestampNow % (interval1H*24*3));
console.log("Calculated time: " + moment(timestampMinus3Days).format("DD.MM.YYYY HH.mm.ss"))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

最新更新