我知道当我用谷歌搜索它时,有很多这样的问题,我似乎无法使其发挥作用。我使用Safari作为我的bowser,这对我来说是OS X Yosemite以后的新手。但是,我无法想出这个。
使用Keith Wood倒计时插件,我想做的就是从数据库获取日期时间并增加2小时。这是代码:
$(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});
});
看起来很简单,我试图再次将新的调整日期(额外两小时)换成新日期,但这给了我同样的问题。
以下是控制台中的输出:
使用console.log(新日期(结束时间);
2014-10-24 19:48:01
无效日期
2014-10-24 19:39:14
无效日期
2014-10-24 19:30:23
无效日期
和
使用console.log(endtime):
2014-10-24 19:56:14
的NaN
22014-10-24 19:48:01
的NaN
2014-10-24 19:39:14
的NaN
2014-10-24 19:30:23
的NaN
值得注意的是,我已经尝试了许多例子,我在日期中添加了几个小时,但没有一个工作,所以这个例子似乎是最合乎逻辑的,但我做的事情是愚蠢的错误。有什么想法吗?
更新
在下面的帮助下,我有一些问题,或许在我的解释中我没有说清楚。
看起来这个日期来自一个循环jquery(ajax)/ php / database / php(echo)/ jquery(ajax)看起来像这样:
2014-10-24 19:30:23
我认为上述内容不是有效日期,而是字符串。我想这是因为如果我加上这个:
newYear = new Date(value.added);
我无效日期。因此,无法评估任何getHours()请求,因此会出错。
我试过分解字符串,并重新创建一个像这样的新日期:
var dt = newYear.split(/\-|\s/);
endDate = new Date(dt[2] + '/' + dt[1] + '/' + dt[0] + ' ' + dt[3]);
console.log(endDate.getFullYear());
但上面给了我一个 NaN 。
我认为它是一个字符串的原因是,如果我输入以下代码:
if(String(value.added)){
console.log('isString Date')
} else {
console.log('is Not String Date')
}
控制台打印 isString日期
这解释了为什么倒计时有效,但没有给出准确的时间。数据库是mySQL。
所以是因为时间是通过php传递的,然后是JS,因为数据库的列被设置为datetime?
答案 0 :(得分:1)
以防我在问题的最后更新时进行测试,并添加“T”修复问题:
var newYear = new Date(value.added.replace(" ", "T"));
那应该解决问题。由于最多应有一个空间,因此不需要进行任何额外的测试。
更新,因为我的第一个答案是假设开始日期无效。结束日期实际上是问题:
var endtime = newYear.setHours(newYear.getHours() + (2));
这肯定会带来风险,因为它可能无法在所有实施中发挥作用。另外,它会直接修改newYear,所以我不会在创建新变量时看到这一点。
我建议以下方法解决问题:
var endtime = new Date(newYear.getTime() + 7200000);
其中7,200,000是2 * 60 * 60 * 1000,或2小时内的毫秒数。
根据ECMAScript 5,使用parse()
函数(15.9.4.2)解析日期格式。
这告诉您该语言尝试使用与x.toUTCString()
生成的格式类似的格式转换字符串,这应该是您在输出中显示的格式。这应符合简化的ISO 8601格式,而不需要日期和时间之间的“T”:
YYYY-MM-DD HH:mm:ss.sssZ
根据我的理解,.sssZ
不是必需的,但您可以尝试这样的事情:
var newYear = new Date(value.added + ".000Z");
您可能还想检查15.9.5.42 toUTCString()
和15.9.5.43 toISOString()
。
但是,如果您之前说过使用Date
从toUTCString()
对象中提取字符串并且转换失败,则该JavaScript实现中存在一个错误,因为ECMAScript清楚地说这样的往返应该返回完全相同的值:
如果x是ECMAScript的特定实现中毫秒数量为零的任何Date对象,则如果引用的所有属性都具有其初始值,则以下所有表达式应在该实现中生成相同的数值:
x.valueOf()
Date.parse(x.toString())
Date.parse(x.toUTCString())
Date.parse(x.toISOString())