如何按原样从javascript读取和存储datetime到mysql
我正在构建一个applicationnode.js,用户在其中创建一个名为tour date和time的记录。我使用插件显示日期和时间下拉窗口。一旦用户保存了记录,它就会作为datetime字段保存在MySQL表中 然后,我将使用显示给定月份和年份的所有巡演日期 但问题是。假设我选择2018年11月28日下午6:30作为巡演日期和时间。在daterange选择器中,它被另存为如何按原样从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
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,你就可以出发了。
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
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”李>
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
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,然后当涉及到我的点头时