Node.js请求内调用date.getHours返回NaN(Heroku部署环境)
问题解决:Heroku上Node.js请求时获取EST时区小时数返回NaN的问题
问题原因
你之前的代码中,new Date().toLocaleString(...)返回的是格式化后的字符串(比如"10/5/2024, 14:30:00"),直接将这个字符串传给new Date()时,不同环境(比如Heroku服务器)可能无法正确解析该格式,导致生成的day是无效的Date对象,调用getHours()自然返回NaN。
解决方案
不需要将Date对象转成字符串再重新解析,直接通过国际化API从原始Date对象中提取EST时区的小时数即可,同时能自动处理夏令时(EDT/EST切换)的问题。
可行代码示例
app.post('/heroku-url', (request, response, next) => { const now = new Date(); // 提取EST时区的小时数 const estHour = new Intl.DateTimeFormat('en-US', { hour: '2-digit', hour12: false, timeZone: 'America/New_York' }).formatToParts(now).find(part => part.type === 'hour').value; console.log("My Hours is " + parseInt(estHour, 10)); });
另一种简化写法
如果只需要小时数,也可以直接格式化后拆分,但上面的formatToParts更可靠:
app.post('/heroku-url', (request, response, next) => { const estTimeStr = new Date().toLocaleTimeString('en-US', { hour12: false, timeZone: "America/New_York" }); // 拆分出小时部分(格式为HH:mm:ss) const estHour = estTimeStr.split(':')[0]; console.log("My Hours is " + parseInt(estHour, 10)); });
补充说明
把代码移到请求外部会导致只在dyno启动时获取一次时间,之后所有请求复用这个初始值,这显然不符合“每次请求获取当前时段”的需求,所以必须将时间获取逻辑放在请求处理函数内部。
内容的提问来源于stack exchange,提问作者Babou
相关产品推荐
相关产品推荐

