Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何按原样从javascript读取和存储datetime到mysql_Mysql_Datetime_Sequelize.js_Momentjs - Fatal编程技术网

如何按原样从javascript读取和存储datetime到mysql

如何按原样从javascript读取和存储datetime到mysql,mysql,datetime,sequelize.js,momentjs,Mysql,Datetime,Sequelize.js,Momentjs,我正在构建一个applicationnode.js,用户在其中创建一个名为tour date和time的记录。我使用插件显示日期和时间下拉窗口。一旦用户保存了记录,它就会作为datetime字段保存在MySQL表中 然后,我将使用显示给定月份和年份的所有巡演日期 但问题是。假设我选择2018年11月28日下午6:30作为巡演日期和时间。在daterange选择器中,它被另存为 2018-11-28 01:00:00 2018-11-28 18:30 我没有为daterangepicker或mo

我正在构建一个applicationnode.js,用户在其中创建一个名为tour date和time的记录。我使用插件显示日期和时间下拉窗口。一旦用户保存了记录,它就会作为datetime字段保存在MySQL表中

然后,我将使用显示给定月份和年份的所有巡演日期

但问题是。假设我选择2018年11月28日下午6:30作为巡演日期和时间。在daterange选择器中,它被另存为

2018-11-28 01:00:00
2018-11-28 18:30

我没有为daterangepicker或momentjs设置任何时区。 我从表单中获得的日期时间(保存到数据库之前)是相同的。i、 e.时间为2018-11-28 18:30

但是,在保存到数据库时,它会另存为

2018-11-28 01:00:00
它将+06:30(IST,印度标准时间值)添加到传入日期时间字段

因此,当我打开日历时,日期是正确的(2018年11月28日),但时间不正确。用户保存了该字段,希望时间为下午6:30,但看到的却是01:00

我将日期时间保存为

var tourDate = new Date(req.body.tour_date).toISOString();
我正在使用Sequelize ORM,我没有给出任何特定的时区

const sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASSWORD, {
    host: process.env.DB_HOST,
    port: 3306,
    dialect: 'mysql',
    pool: {
        max: 10,
        min: 0,
        acquire: 30000,
        idle: 10000
    },
    logging: false
});
我想做的是不管用户所在的时区是哪个。我想将给定的日期和时间按原样保存在数据库中,并按原样检索,以显示在日历中


如何实现这一点?

如果您通过sequelize存储日期,则它将日期存储为UTC,

因此,从前端只需传递UTC中的日期,就可以存储它 如果您使用的是日期时间选择器,它会自动将UTC转换为您的时区,只需将UTC数据传递给您的插件即可


只要在通过时使用UTC,您就可以开始了。如果您通过sequelize存储日期,那么它会将日期存储为UTC,

因此,从前端只需传递UTC中的日期,就可以存储它 如果您使用的是日期时间选择器,它会自动将UTC转换为您的时区,只需将UTC数据传递给您的插件即可

只要在传球时使用UTC,你就可以出发了。

  • 如果在mysql中使用DATETIME数据类型,则值saveas为 独立于mysql时区系统变量。见和
  • mysql根据时区系统变量为某些函数返回不同的值。例如:

    SET time_zone='+00:00'; 
    SELECT now(); //2018-11-30 17-52-00
    
    SET time_zone='+03:00'; 
    SELECT now(); //2018-11-30 20-52-00
    
  • 您可以在sequelize to DB connetion中传递时区选项。默认情况下 '+00:00'. 首先,Sequelize使用此值设置时区 每个连接上的选项(如果使用开始续集,您可以看到它) 调试变量)。另外,Sequelize(或mysql2包,我不知道)使用时区选项将mysql返回的结果转换为js日期对象。因此:

    const sequelize = new Sequelize('database', 'user', 'password', {timezone: "+00:00"});
    
    sequelize.query('SELECT now() AS now;', {type: sequelize.QueryTypes.SELECT})
    //2018-11-30T17:52:00.000Z
    
    sequelize.query('SELECT createdAt FROM users WHERE userId = 1;', {type: sequelize.QueryTypes.SELECT})
    //2017-09-05T13:43:00.000Z
    
    
    const sequelize = new Sequelize('database', 'user', 'password', {timezone: "+03:00"});
    
    sequelize.query('SELECT now() AS now;', {type: sequelize.QueryTypes.SELECT})
    //2018-11-30T17:52:00.000Z
    
    sequelize.query('SELECT createdAt FROM users WHERE userId = 1;', {type: sequelize.QueryTypes.SELECT})
    //2017-09-05T10:43:00.000Z 
    
  • 说明:

    对于现在的

    +-----------+---------------------+----------------------------+--------------------------+
    | time_zone | mysql return        | sequelize read result as   | sequelize return         |
    +-----------+---------------------+----------------------------+--------------------------+
    |  +00:00   | 2018-11-30 17-52-00 | 2018-11-30 17-52-00 +00:00 | 2018-11-30T17:52:00.000Z |
    +-----------+---------------------+----------------------------+--------------------------+
    |  +03:00   | 2018-11-30 20-52-00 | 2018-11-30 20-52-00 +03:00 | 2018-11-30T17:52:00.000Z |
    +-----------+---------------------+----------------------------+--------------------------+
    
    对于
    createdAt

    +-----------+---------------------+----------------------------+--------------------------+
    | time_zone | mysql return        | sequelize read result as   | sequelize return         |
    +-----------+---------------------+----------------------------+--------------------------+
    |  +00:00   | 2017-09-05 13-43-00 | 2017-09-05 13-43-00 +00:00 | 2017-09-05T13:43:00.000Z |
    +-----------+---------------------+----------------------------+--------------------------+
    |  +03:00   | 2017-09-05 13-43-00 | 2017-09-05 13-43-00 +03:00 | 2017-09-05T10:43:00.000Z |
    +-----------+---------------------+----------------------------+--------------------------+
    
    因此,在使用DATETIME数据类型时,在设置时区选项时要小心。如果您仅使用sequelize插入/选择数据,则无需更改时区选项

    为了在工作中正确使用datetime,我使用以下规则:

    • 对于客户端和服务器之间的传输日期时间,请使用唯一确定的格式:,(类似于
      2017-09-05T13:43:00.000Z的字符串)
      
    • Mysql数据库存储区中的所有日期时间值均为零时区(+00:00);所以Sequelize的时区选项是“+00:00”
    最后,浏览器在您的计算机上使用时区设置。检查所有步骤的值,并消除与时区错误解释相关的不确定性

  • 如果在mysql中使用DATETIME数据类型,则值saveas为 独立于mysql时区系统变量。见和
  • mysql根据时区系统变量为某些函数返回不同的值。例如:

    SET time_zone='+00:00'; 
    SELECT now(); //2018-11-30 17-52-00
    
    SET time_zone='+03:00'; 
    SELECT now(); //2018-11-30 20-52-00
    
  • 您可以在sequelize to DB connetion中传递时区选项。默认情况下 '+00:00'. 首先,Sequelize使用此值设置时区 每个连接上的选项(如果使用开始续集,您可以看到它) 调试变量)。另外,Sequelize(或mysql2包,我不知道)使用时区选项将mysql返回的结果转换为js日期对象。因此:

    const sequelize = new Sequelize('database', 'user', 'password', {timezone: "+00:00"});
    
    sequelize.query('SELECT now() AS now;', {type: sequelize.QueryTypes.SELECT})
    //2018-11-30T17:52:00.000Z
    
    sequelize.query('SELECT createdAt FROM users WHERE userId = 1;', {type: sequelize.QueryTypes.SELECT})
    //2017-09-05T13:43:00.000Z
    
    
    const sequelize = new Sequelize('database', 'user', 'password', {timezone: "+03:00"});
    
    sequelize.query('SELECT now() AS now;', {type: sequelize.QueryTypes.SELECT})
    //2018-11-30T17:52:00.000Z
    
    sequelize.query('SELECT createdAt FROM users WHERE userId = 1;', {type: sequelize.QueryTypes.SELECT})
    //2017-09-05T10:43:00.000Z 
    
  • 说明:

    对于现在的

    +-----------+---------------------+----------------------------+--------------------------+
    | time_zone | mysql return        | sequelize read result as   | sequelize return         |
    +-----------+---------------------+----------------------------+--------------------------+
    |  +00:00   | 2018-11-30 17-52-00 | 2018-11-30 17-52-00 +00:00 | 2018-11-30T17:52:00.000Z |
    +-----------+---------------------+----------------------------+--------------------------+
    |  +03:00   | 2018-11-30 20-52-00 | 2018-11-30 20-52-00 +03:00 | 2018-11-30T17:52:00.000Z |
    +-----------+---------------------+----------------------------+--------------------------+
    
    对于
    createdAt

    +-----------+---------------------+----------------------------+--------------------------+
    | time_zone | mysql return        | sequelize read result as   | sequelize return         |
    +-----------+---------------------+----------------------------+--------------------------+
    |  +00:00   | 2017-09-05 13-43-00 | 2017-09-05 13-43-00 +00:00 | 2017-09-05T13:43:00.000Z |
    +-----------+---------------------+----------------------------+--------------------------+
    |  +03:00   | 2017-09-05 13-43-00 | 2017-09-05 13-43-00 +03:00 | 2017-09-05T10:43:00.000Z |
    +-----------+---------------------+----------------------------+--------------------------+
    
    因此,在使用DATETIME数据类型时,在设置时区选项时要小心。如果您仅使用sequelize插入/选择数据,则无需更改时区选项

    为了在工作中正确使用datetime,我使用以下规则:

    • 对于客户端和服务器之间的传输日期时间,请使用唯一确定的格式:,(类似于
      2017-09-05T13:43:00.000Z的字符串)
      
    • Mysql数据库存储区中的所有日期时间值均为零时区(+00:00);所以Sequelize的时区选项是“+00:00”

    最后,浏览器在您的计算机上使用时区设置。检查所有步骤的值,并消除与时区错误解释相关的不确定性。

    好吧,在经历了许多困惑之后,这里是如何解决这个问题的。我必须将客户端的日期转换为utc,然后当它涉及到node.js服务器时,我需要在将其保存到数据库之前再次将其转换为utc

    在客户端,我在一个隐藏的输入字段中设置日期(这是我要发送给服务器的)

    因此,一台服务器作为

    2018-12-31T10:30:00.000Z

    然后我必须用这样的时刻再次处理:

    moment.utc(req.body.tour_date); //this is saved to db
    
    当我读取记录并将其显示给用户时,我会将日期重新处理为

    moment.utc(act.tour_date).format('DD/MM/YYYY hh:mm A')
    
    因此,用户可以在datepicker中看到2018年12月31日上午10:30

    我还将
    moment.utc(act.tour\u date).format('YYYY-MM-DDTHH:MM:ss')
    传递回隐藏的输入,以防用户更新记录


    谢谢所有帮助我解决这个问题的人。感谢您的时间和努力。

    好吧,在经历了许多困惑之后,这里是如何解决这个问题的。我必须将客户端的日期转换为utc,然后当涉及到我的点头时