将新时间添加到仅显示NaN的新日期

时间:2014-10-26 09:45:28

标签: javascript date

我知道当我用谷歌搜索它时,有很多这样的问题,我似乎无法使其发挥作用。我使用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?

1 个答案:

答案 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()

但是,如果您之前说过使用DatetoUTCString()对象中提取字符串并且转换失败,则该JavaScript实现中存在一个错误,因为ECMAScript清楚地说这样的往返应该返回完全相同的值:

  

如果x是ECMAScript的特定实现中毫秒数量为零的任何Date对象,则如果引用的所有属性都具有其初始值,则以下所有表达式应在该实现中生成相同的数值:

  x.valueOf()
  Date.parse(x.toString())
  Date.parse(x.toUTCString())
  Date.parse(x.toISOString())