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

add hours to new Date only showing NaN

本文关键字:新日期 日期 NaN 添加 小时 显示      更新时间:2023-09-26

当我在谷歌上搜索时,我知道有很多这样的问题,但我似乎无法让它发挥作用。我使用Safari作为我的浏览器,这对我来说是自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

无效日期

和:

带控制台.log(结束时间):

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吗?

以防万一,我用问题的最后一次更新进行了测试,并添加了"T"来修复问题:

var newYear = new Date(value.added.replace(" ", "T"));

这应该能解决问题。由于最多应该有一个空间,因此不需要任何额外的测试。


更新作为我的第一个答案是假设开始日期无效。结束日期实际上是个问题:

var endtime = newYear.setHours(newYear.getHours() + (2));

这当然是在冒险,因为它可能不适用于所有的实现。另外,它直接修改newYear,所以我不认为创建新变量有什么意义。

我建议以下方法来解决问题:

var endtime = new Date(newYear.getTime() + 7200000);

其中7200000是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()

然而,如果您说您之前使用toUTCString()Date对象中提取了一个字符串,并且返回的转换失败,那么JavaScript实现中存在一个错误,因为ECMAScript明确表示,这样的往返应该返回完全相同的值:

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

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