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

NestJS中如何将00:39:41格式的时间字符串转为Date类型?

在NestJS中实现时间字符串到Date类型的转换

原代码

@Cron('23 16 * * *')
async transferData() {
  try {
    // 从AttendanceBulk表获取数据
    const attendanceBulkData = await this.AttendanceBulkModel.findAll();

    for (const data of attendanceBulkData) {
      const attendance = new Attendance();
      
      // 根据data.UserId查找对应的AttendanceAndBulk记录
      const attendanceAndBulk = await AttendanceAndBulk.findOne({ where: { UserId: data.UserId } });

      if (attendanceAndBulk) {
        attendance.employeeId = attendanceAndBulk.employeeId;
        attendance.shiftType = data.Intime ? ShiftType.In : ShiftType.Out;
        attendance.time = new Date(`${data.Intime}`);;
        attendance.date = data.Date;
        attendance.outTime= data.Date;

        console.log(data.Intime)
        await attendance.save();
      }
    }

    this.logger.log('数据传输完成。');
  } catch (error) {
    this.logger.error('数据传输失败:', error);
  }
}

问题说明

上述代码中,data.Intime是00:39:41格式的时分秒字符串,直接通过new Date(${data.Intime})生成Date对象会得到无效值,需要将该字符串与data.Date(已为Date类型)的日期部分结合,生成正确的Date类型值赋值给attendance.time。

解决方案

方法一:拼接完整时间字符串(原生实现)

利用data.Date的日期部分,与data.Intime拼接成标准ISO格式字符串,再生成Date对象:

// 提取data.Date的YYYY-MM-DD部分
const datePart = data.Date.toISOString().split('T')[0];
// 拼接成完整的ISO时间字符串
const fullTimeString = `${datePart}T${data.Intime}`;
// 生成正确的Date对象
attendance.time = new Date(fullTimeString);

方法二:直接修改Date对象的时分秒(原生实现)

复制data.Date的日期,手动设置时分秒:

// 拆分时分秒为数字
const [hours, minutes, seconds] = data.Intime.split(':').map(Number);
// 基于data.Date创建新的Date对象
const targetDate = new Date(data.Date);
// 设置时分秒
targetDate.setHours(hours);
targetDate.setMinutes(minutes);
targetDate.setSeconds(seconds);
attendance.time = targetDate;

方法三:使用日期处理库(如moment/date-fns)

如果项目已引入日期处理库,可简化操作:

Moment.js示例:

import * as moment from 'moment';

attendance.time = moment(data.Date)
  .set('hour', parseInt(data.Intime.split(':')[0], 10))
  .set('minute', parseInt(data.Intime.split(':')[1], 10))
  .set('second', parseInt(data.Intime.split(':')[2], 10))
  .toDate();

date-fns示例:

import { setHours, setMinutes, setSeconds } from 'date-fns';

const [hours, minutes, seconds] = data.Intime.split(':').map(Number);
attendance.time = setSeconds(
  setMinutes(
    setHours(new Date(data.Date), hours),
    minutes
  ),
  seconds
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:15:37