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

如何使用Sequelize根据指定时区的日期范围获取数据

解决指定时区日期范围的createdAt查询问题

问题原因

数据库中createdAt字段以UTC时间存储(示例:2022-06-14 02:37:16.236+00),当前代码直接将带时区的moment对象传入查询条件,Sequelize自动转换UTC时逻辑有误——你需要的是指定时区当天起止时间对应的UTC时间范围,而非直接使用时区本地时间的moment对象。

修正方案

核心思路:先计算指定时区的当天起止时间,再将其转换为对应的UTC时间,用这个UTC范围匹配数据库中的UTC存储值。

修正后的代码

let timezone = req.header('Timezone')
if (!timezone || !moment.tz.zone(timezone)) {
    timezone = moment.tz.guess();
}

// 1. 计算指定时区的当天起止时间(本地时间)
const localStartOfDay = moment(date).tz(timezone).startOf('day');
const localEndOfDay = moment(localStartOfDay).tz(timezone).endOf('day');

// 2. 转换为UTC时间的ISO字符串,供数据库查询使用
const utcStart = localStartOfDay.utc().toISOString();
const utcEnd = localEndOfDay.utc().toISOString();

// Fetch all completed events within the date range
const events = await models.Event.findAll({
    attributes: [
      'id',
      'accuracy',
    ],
    where: {
      status: 'completed',
      createdAt: {
        [Op.between]: [utcStart, utcEnd],
      },
    },
    order: [['createdAt', 'ASC']],
    raw: true,
  })

关键修改点

  • 明确区分本地时区时间与UTC时间:先基于指定时区计算当天起止点,再转换为UTC格式
  • 使用.utc().toISOString()将本地时区时间转换为数据库可识别的UTC标准格式,确保查询范围准确
  • 保留原有时区校验逻辑,保证时区参数合法性

示例验证

假设时区为Asia/Shanghai(UTC+8),查询日期为2022-06-14:

  • 本地时区startOfDay为2022-06-14T00:00:00+08:00,转换为UTC是2022-06-13T16:00:00.000Z
  • 本地时区endOfDay为2022-06-14T23:59:59.999+08:00,转换为UTC是2022-06-14T15:59:59.999Z
  • 数据库中2022-06-14 02:37:16.236+00(即2022-06-14T02:37:16.236Z)会被包含在该UTC范围内,符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:05:26