Javascript 将小时数添加到仅显示NaN的新日期
我知道当我在谷歌上搜索时,有很多这样的问题,我似乎无法让它工作。我使用Safari作为我的bowser,这对我来说是自OSX优胜美地以来的新鲜事。但是,我无法理解这一点 我所要做的就是,使用KeithWood倒计时插件,从数据库中获取一个日期时间,并添加2个小时。代码如下:Javascript 将小时数添加到仅显示NaN的新日期,javascript,date,Javascript,Date,我知道当我在谷歌上搜索时,有很多这样的问题,我似乎无法让它工作。我使用Safari作为我的bowser,这对我来说是自OSX优胜美地以来的新鲜事。但是,我无法理解这一点 我所要做的就是,使用KeithWood倒计时插件,从数据库中获取一个日期时间,并添加2个小时。代码如下: $(data).each(function(key, value) { var box = ''; box += '<div class="outterBox" id="qBox'+value.qi
$(data).each(function(key, value) {
var box = '';
box += '<div class="outterBox" id="qBox'+value.qid+'" name="'+value.qid+'">'+value.question+'</div>';
box += '<div id="timer'+value.qid+'"></div>';
var newYear = new Date(value.added);
var endtime = newYear.setHours(newYear.getHours() + (2));
console.log(value.added);
console.log(endtime);
$('#listQuestions').append(box);
$('#timer'+value.qid).countdown({until: endtime});
});
我得到了无效的日期。因此,无法计算任何getHours()请求,因此会给出一个错误
我试着分解字符串,重新创建一个新的日期,如下所示:
var dt = newYear.split(/\-|\s/);
endDate = new Date(dt[2] + '/' + dt[1] + '/' + dt[0] + ' ' + dt[3]);
console.log(endDate.getFullYear());
var newYear = new Date(value.added + ".000Z");
但是上面给了我一个NaN
我之所以认为它是字符串,是因为我输入了以下代码:
if(String(value.added)){
console.log('isString Date')
} else {
console.log('is Not String Date')
}
控制台打印i字符串日期
这就解释了为什么倒计时有效,但不能给出准确的时间。数据库是mySQL
这是因为时间是通过php传递的,然后JS,因为database is列被设置为datetime?以防我使用问题的最后一次更新进行测试,并添加“T”修复了问题:
var newYear = new Date(value.added.replace(" ", "T"));
var endtime = newYear.setHours(newYear.getHours() + (2));
var endtime = new Date(newYear.getTime() + 7200000);
这应该可以解决问题。因为最多应该有一个空间,所以不需要进行任何额外的测试
更新为我的第一个答案是假设开始日期无效。结束日期实际上是个问题:
var newYear = new Date(value.added.replace(" ", "T"));
var endtime = newYear.setHours(newYear.getHours() + (2));
var endtime = new Date(newYear.getTime() + 7200000);
这当然是在冒险,因为它可能不适用于所有实现。另外,它直接修改新年,所以我不会看到创建新变量的意义
我建议采用以下方法解决此问题:
var newYear = new Date(value.added.replace(" ", "T"));
var endtime = newYear.setHours(newYear.getHours() + (2));
var endtime = new Date(newYear.getTime() + 7200000);
其中7200000是2*60*60*1000,或2小时内的毫秒数
根据ECMAScript 5,使用
parse()
函数(15.9.4.2)解析日期格式
这告诉您,该语言尝试使用类似于x.toutString()
将产生的格式转换字符串,这应该是您在输出中显示的格式。这应与简化的ISO 8601格式相匹配,不需要在日期和时间之间使用“T”:
YYYY-MM-DD HH:mm:ss.sssZ
据我所知,.sssZ
不是必需的,但您可以尝试以下方法:
var dt = newYear.split(/\-|\s/);
endDate = new Date(dt[2] + '/' + dt[1] + '/' + dt[0] + ' ' + dt[3]);
console.log(endDate.getFullYear());
var newYear = new Date(value.added + ".000Z");
您可能还需要检查15.9.5.42 toutString()
和15.9.5.43 toISOString()
但是,如果您说您以前使用toutString()
从Date
对象提取了字符串,并且返回的转换失败,那么该JavaScript实现中就存在一个错误,因为ECMAScript清楚地指出,这样的往返应该返回完全相同的值:
如果x是ECMAScript的特定实现中毫秒数为零的任何日期对象,则如果引用的所有属性都有其初始值,则以下所有表达式应在该实现中生成相同的数值:
什么是
console.log(新年)代码>给你?它看起来像值。添加的不是日期构造函数的有效参数。Date的构造函数需要一个格式为特定方式()的字符串,或者一个表示从大纪元开始的毫秒数的数字。@Matthewstrobbridge newYear给我“2014-10-24 19:30:23”@Sacho value.added被转换为一个新的日期,所以这不会改变数据库存储的内容,进入正确的结构?哪里是value.added
变为日期?来自什么?效果如何?尝试发布所有代码的示例,例如在JSFIDLE上。或者,学习如何使用chrome的调试器工具并找出事物的实际值。value.added+'.000Z'
outputs 2014-10-24 20:14:30.000Z<代码>新日期(value.added+'.000Z')
输出无效日期newYear.setHours(newYear.getHours())+2
。对我来说没什么意义:(可能还值得注意的是,仅使用value.added
就可以为我提供正确的日期/时间,并且可以使用倒计时插件。啊。感谢您指出问题出现在结束日期。我现在在您的问题中清楚地看到了这一点。我更新了我的答案,并针对该特定点进行了修复,尽管您可能需要在wh中使用Unix时间。)很明显,我的情况是你不必做新建日期(…)
。我已经更新了我的问题,这可能会有更多帮助。好的,我添加了一个更新。修复方法似乎只是在日期和时间之间添加“T”。PHP/AJAX实际上只能返回字符串。字符串如“33”
将自动转换为一个数字(使用+运算符除外,在这种情况下,您可能会得到一个串联)。有一种方法可以获得这样的数字:使用JSON转换接收到的数据,包括源文档中定义的字符串和数字,以及对象和数组(但仍然没有日期)。