You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 01:20:38