【问题标题】:add hours to new Date only showing NaN将小时数添加到仅显示 NaN 的新日期
【发布时间】:2026-02-03 10:45:01
【问题描述】:

我知道当我用谷歌搜索时有很多这样的问题,但我似乎无法让它发挥作用。我使用 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(new Date(endtime);

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 Date

这解释了为什么倒计时有效,但没有给出准确的时间。数据库是 mySQL。

是不是因为时间是通过php传递的,然后是JS,因为数据库是列设置为datetime?

【问题讨论】:

  • console.log(newYear); 带给你什么?
  • 看起来value.added 不是 Date 构造函数的有效参数。 Date 的构造函数需要一个以特定方式格式化的字符串 (es5.github.io/#x15.9.4.2) 或表示自纪元时间以来的毫秒数。
  • @MatthewStrawbridge newYear 给我 '2014-10-24 19:30:23'
  • @Sacho value.added 被转换成一个新的日期,所以这不会改变数据库存储它的任何内容,进入正确的结构吗?
  • value.added 在哪里变成了一个日期?从何而来?有什么效果?尝试发布所有代码的示例,例如在jsfiddle上。或者,学习如何使用 chrome 的调试器工具并找出事物的实际值。

标签: javascript date


【解决方案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()

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

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

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

【讨论】:

  • value.added + '.000Z' 输出 2014-10-24 20:14:30.000Z; new Date(value.added + '.000Z') 输出 无效日期; newYear.setHours(newYear.getHours()) + 2 输出 NaN。对我来说没什么意义:(
  • 可能还值得注意的是,仅使用value.added 确实给了我正确的日期/时间,并且可以与倒计时插件一起使用。
  • 啊。感谢您指出问题出在结束日期。我现在在你的问题中清楚地看到了这一点。我用针对该特定点的修复更新了我的答案,尽管您可能需要一个 Unix 时间,在这种情况下您显然不必执行new Date(...)
  • 我已经更新了我的问题,这可能会有所帮助。
  • 好的,我添加了更新。修复似乎只是在日期和时间之间添加“T”。 PHP/AJAX 不能返回字符串以外的任何东西。诸如"33" 之类的字符串将自动转换为数字(使用+ 运算符除外,在这种情况下您可能会得到连接)。有一种获取数字的方法:使用 JSON 来转换源文档中定义的字符串和数字中接收到的数据,以及对象和数组(但仍然没有日期)。