Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅使用Date.valueOf()在JavaScript中查找上一年_Javascript_Date - Fatal编程技术网

仅使用Date.valueOf()在JavaScript中查找上一年

仅使用Date.valueOf()在JavaScript中查找上一年,javascript,date,Javascript,Date,我试图获取JavaScript中最接近的绝对年份的毫秒值,只对JavaScript日期对象的valueOf()方法进行响应 例如:今天是2016年4月4日星期一上午12:50。因此,我在寻找(过去)最近的绝对年份。2016年1月1日00:00 以下是我的代码: var ms_per_year = 31536000000; var now = new Date().valueOf(); var mod_year = now % ms_per_year; var nearest_absolute_y

我试图获取JavaScript中最接近的绝对年份的毫秒值,只对JavaScript日期对象的
valueOf()
方法进行响应

例如:今天是2016年4月4日星期一上午12:50。因此,我在寻找(过去)最近的绝对年份。2016年1月1日00:00

以下是我的代码:

var ms_per_year = 31536000000;
var now = new Date().valueOf();
var mod_year = now % ms_per_year;
var nearest_absolute_year = now - mod_year;

console.log(new Date(nearest_absolute_year));
// Sun Dec 20 2015 19:00:00 GMT-0500 (EST)
console.log(new Date(Date.parse('2016 1 1 00:00:00')));
// Fri Jan 01 2016 00:00:00 GMT-0500 (EST)
我希望这两个打印日期是相同的,因为它们与分钟相同:

var ms_per_minute = 60 * 1000;
var now = new Date().valueOf();
var mod_minute = now % ms_per_minute;
var nearest_absolute_minute = now - mod_minute;

console.log(new Date(nearest_absolute_minute));
// Mon Apr 04 2016 00:57:00 GMT-0400 (EDT)
console.log(new Date(Date.parse('2016 4 4 00:57:00')));
// Mon Apr 04 2016 00:57:00 GMT-0400 (EDT)

我如何计算自1970年以来经过的毫秒数以及今年年初使用Date.parse()的毫秒数,这完全依赖于数学?

由于以下假设,您的逻辑不起作用

var ms_per_year = 31536000000
对于365天的年份,这是毫秒的正确值,但您忘记将闰年考虑在内

下面的代码将有所帮助

var ms_per_year = 31536000000;
var ms_per_day = 86400000;
var now = new Date().valueOf();
var mod_year = now % ms_per_year;
var year = Math.floor(now/ms_per_year);
var leap_years = Math.floor(year/4);
var nearest_absolute_year = now - mod_year;
var actual_value = nearest_absolute_year + (leap_years*ms_per_day);
console.log(new Date(actual_value)); 

如果您发现任何错误,请纠正我。

您需要处理闰年,Himanshu正在寻找一个优雅的解决方案,一个简单的循环可以解决问题,但效率不高:

/*@返回本年年初的{number}时间值
**不要使用日期方法
**假设当前时间在历元之后(1970-01-01T00:00:00Z)
*/
函数getStartOfYear(时间值){
var timeValue=timeValue | | Date.now();
var累计时间=0;
var日=8.64e7;
var年=1970年;
var msForYear=365*天;//1970年为毫秒
函数isLeap(n){
回报率((第%4年==0)和&(第%100年!=0))| |(第%400年==0);
}
//继续,同时为当前年度添加ms不会超过限制
而((累计时间+msForYear)UTC年初:'+startOfYear.toISOString());
startOfYear.setMinutes(startOfYear.getMinutes()+startOfYear.getTimezoneOffset());
文件。写入(“
本地年初:”+startOfYear); });
正文{
字体系列:courier、mono space;
字体大小:90%

}
这应该可以做到:

var d = new Date(new Date().getFullYear(), 0);
d.valueOf(); // > 1451634391371 (ms)

无论如何,您都不会使用Date.parse。如果您有一个时间值,您可以将其直接传递给日期构造函数。但你不想这么做……算法是计算出从1970-01-01T00:00:00Z到Anwhere的天数,然后乘以8.64e7。我想知道你为什么坚持要得到你想要的。31536000000相当于365天,你忘记了闰年,其中自1970年以来已经有11个(不包括2016年)所以你的约会时间是11天。getMinutes只获取时间的分钟部分,而不是从历元开始的分钟,因此只要减去整天(或者实际上是整小时),它就不会改变。这将返回我
2016年1月1日星期五01:00:00 GMT+0100(CET)
,这仍然不是正确的时间。如果请求的时间戳应该是UTC,则是正确的。对于像2013-04-01这样的日期,这将失败,因为它无法准确计算闰年数。另外,
new Date().valueOf()
会比
Date更好。现在
@Arjan您可以调整主机时区偏移的分钟数,因此
实际值.setMinutes(实际值.getMinutes()+实际值.getTimezoneOffset())
。这个符号很奇怪,因为ECMAScript时区值与ISO 8601相反,所以-ve表示东方,+ve表示西方。@RobG,为什么
Date.now()
Date.valeOf()好呢?
?这很好,但这个问题需要一个完全基于mathsI所说的解决方案,因为它包含循环,条件运算等,而不是纯粹的数学。这是非常有趣的@RobG,我今晚将深入研究它。@RobG,精彩的答案!使用:
console.log(新日期(getStartOfYear(Date.now()))进行测试并获取
2015年12月31日周四19:00:00 GMT-0500(美国东部时间)
,这正是我所期望的。我绝对没有想到这么快就会出现这样一个优雅的解决方案。这看起来是最具可读性、最不容易出错的解决方案。您可能还需要设置小时、分钟、秒和毫秒,但这仍然很简单。OP希望避免使用日期方法(为什么是个谜)。否则,获取任何时间值的年初都很简单,
newdate(newdate(value).getFullYear(),0)
@Kutyel,
.getFullYear()
是欺骗:)-@RobG,我想规范化JS-Date对象下发生的事情,而不使用JS-Date对象,为什么?老实说:因为这对我来说是个有趣的问题。