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

Angular中如何将字符串时间转为Date对象?解决Invalid date错误

解决Angular中12小时制时间字符串转Date对象的问题

这个问题我之前也踩过坑!原生的Date构造函数对仅包含时分和AM/PM的短时间字符串解析支持很差,不同浏览器甚至会有不同的表现,所以直接传"09:56 AM"会返回Invalid Date。下面给你几个靠谱的解决办法:

方法1:手动拼接完整日期字符串(零依赖)

因为Date对象需要完整的日期时间信息才能正确解析,我们可以把当前日期(或者某个固定日期)和时间字符串拼接起来,构造一个标准的可解析字符串:

const time_t = "09:56 AM";
// 方案A:拼接当前日期,时间关联当天
const fullDateTime = `${new Date().toDateString()} ${time_t}`;
this.audit_time = new Date(fullDateTime);

// 方案B:拼接固定日期,适合不需要关联当前日期的场景
const fullDateTimeFixed = `2024-01-01 ${time_t}`;
this.audit_time = new Date(fullDateTimeFixed);

这样构造的字符串是浏览器能稳定解析的格式,不会出现兼容性问题。

方法2:提取时分并手动设置到Date对象(更灵活)

通过正则表达式提取时间字符串里的小时、分钟和AM/PM标识,转换为24小时制后,手动设置到Date对象中:

const time_t = "09:56 AM";
const timeMatch = time_t.match(/(\d{2}):(\d{2}) (AM|PM)/);

if (timeMatch) {
  let hours = parseInt(timeMatch[1], 10);
  const minutes = parseInt(timeMatch[2], 10);
  const period = timeMatch[3];

  // 12小时制转24小时制逻辑
  if (period === 'PM' && hours !== 12) {
    hours += 12;
  }
  if (period === 'AM' && hours === 12) {
    hours = 0;
  }

  // 创建Date对象(默认使用当前日期)并设置时分秒
  this.audit_time = new Date();
  this.audit_time.setHours(hours, minutes, 0, 0);
}

这种方法能精确控制时间值,适合需要对日期或时间做自定义调整的场景。

方法3:使用第三方日期库(推荐,兼容性最佳)

如果你的项目已经引入了轻量的日期库(比如date-fns,比moment.js更推荐,因为它支持tree-shaking,体积更小),可以用库的解析函数来处理:

// 先安装date-fns:npm install date-fns
import { parse } from 'date-fns';

const time_t = "09:56 AM";
// 第三个参数是解析时使用的基准日期,这里用当前日期
this.audit_time = parse(time_t, 'hh:mm a', new Date());

date-fns的parse函数支持明确的格式字符串,完全不用担心浏览器兼容性问题,代码也更简洁。


内容的提问来源于stack exchange,提问作者Rahul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:34:53