SequelizeとExpressでwebアプリケーションを作成しているときに、momentjsで現在時刻を指定して、MySQLからSELECTするときに、時刻がずれるという現象が起こったので、その解消法を紹介します!
実行したソース
1 2 3 4 5 6 7 8 9 |
const todayDate = moment().tz("Asia/Tokyo").format('YYYY-MM-DD'); let res; try { console.log(todayDate) // 2020-06-14 res = await model.findOne({ where: { date: todayDate } }); // SELECT `date`, `createdAt`, `updatedAt` FROM `tableNames` AS `tableName` WHERE `tableName`.`date` = '2020-06-13 15:00:00'; } catch (err) { return next(err); } |
上記のソースが問題になったソースです。
- momentjsにて、TimeZoneをJSTに指定して、現在時刻を取得
- Sequalizeのwhere文にその時刻を取得
- 渡した文字列は6月14日だが、sqlは6月13日で実行される
原因
原因は、SequelizeがUTCタイムでSQLを発行してしまうことでした。
対応
対応方法は、Sequelizeの設定ファイルにTIMEZONEの設定を加えて、JSTタイムで実行するように命令するだけです。
1 2 |
dialect:'mysql', timezone:'+09:00' |
DBの設定をするconfigファイルに上記のようにtimezoneを追加すれば、SequelizeがJSTタイムでクエリを実行するようになるので、解決します!