NodeJS 序列化是将日期保存在不正确的时区

nhaq1z21  于 2023-08-04  发布在  Node.js
关注(0)|答案(1)|浏览(113)

我将日期从前端传递到后端,然后使用sequelize将它们保存到数据库中。来自前端的日期对于用户来说是本地的。第一个问题是当我试图从前端读取日期时,在后端(nodejs),日期出现在错误的时区(-3h)。我用luxon解决了这个问题,并将其设置为前端发送的日期。然后,当我将其保存到数据库时,当我在数据库(mysql)中检查它时,它再次变成错误的时区。我稍后会将日期发送到前端,因此它们必须处于正确的时区。如何将日期保存在正确的时区?代码:

module.exports.create_meal_post = async (req, res) => {
  const { prods, createdAt, ...rest } = req.body;
  const luxonDate = DateTime.fromISO(createdAt);
  const normalizedDate = luxonDate.toISO();
  console.log("from-front-end : ", createdAt); // incorrect date (-3h)
  console.log("luxon date: ", normalizedDate); // correct date
  try {
    const result = await sequelize.transaction(async (t) => {
      const meal = await Meals.create(
        {
          ...rest,
          createdAt: normalizedDate,
          user_id: req.token.userId,
        },
        { transaction: t }
      );
      const meal_id = meal.meal_id;
      const products = prods.map((obj) => {
        return {
          meal_id: meal_id,
          user_id: req.token.userId,
          product_id: obj.product_id,
          createdAt: normalizedDate,
          ...obj,
        };
      });
      await MealProducts.bulkCreate(products, { transaction: t });
      return meal;
    });
    res.status(201).send(result);
  } catch (error) {
    console.log(error);
    res.status(400).json(error);
  }
};

字符串
我也试过用二传手来实现这一点,结果是一样的。记录的结果:
front-end:2023-08- 02 T18:08:14.496Z luxon日期:2023-08- 02 T21:08:14.496+03:00数据库中的保存日期:2023-08-02 18:08:14

xriantvc

xriantvc1#

我解决这个问题的方法是将日期存储为字符串,通过使用luxon提取字符串并将其转换为日期。
模型中的日期属性:

createdAt: {
    type: DataTypes.STRING,
    allowNull: false,
  },

字符串
我把它保存为ISO,然后在获取日期时,我再次将字符串转换为ISO日期。这是用luxon js完成的

相关问题