【发布时间】:2018-12-02 23:45:48
【问题描述】:
我正在构建一个应用程序 node.js,用户在其中创建一个记录,其中包含一个名为游览日期和时间的字段。我正在使用daterangepicker 插件来显示日期和时间下拉窗口。一旦用户保存记录,它就会作为日期时间字段保存在 MySQL 表中。
然后我使用fullcalendar 显示给定月份-年份的所有巡演日期。
但这就是问题所在。假设我选择 28/11/2018 下午 6:30 作为游览日期和时间。在日期范围选择器中,它被保存为
2018-11-28 18:30
$('input#tour_date').daterangepicker({
singleDatePicker: true,
showDropdowns: true,
timePicker: true,
timePickerIncrement: 30,
locale: {
format: 'DD/MM/YYYY hh:mm A'
}
}, function (chosendate) {
$('input[name="tour_date"]').val(moment(chosendate).format('YYYY-MM-DD hh:mm'));
//the value for input becomes 2018-11-28 18:30
});
我没有为 daterangepicker 或 momentjs 设置任何时区。 我从表单中获得的日期时间(在保存到数据库之前)是相同的。即它在 2018-11-28 18:30 出现。
但是在保存到数据库时,它会保存为
2018-11-28 01:00:00
它将 +06:30(IST,印度标准时间值)添加到传入的日期时间字段。
因此,当我打开日历时,日期正确(28/11/2018)但时间不正确。用户保存了期望时间为下午 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
});
我想要做的是无论用户在哪个时区。我想将给定的日期和时间按原样保存在数据库中并按原样检索它,以显示在日历中。
我如何做到这一点?
【问题讨论】:
-
你仔细阅读moment js手册了吗?你有没有想过为什么总是11? 11 月是多少?
-
我将momentjs格式的格式字符串改为'YYYY-MM-DD hh:mm',所以额外11分钟的问题已经解决。但是,它仍然通过向其添加 IST 值来保存日期时间
-
你是在 momentJS 还是 fullCalendar 中设置了时区?网络服务器本身呢?你如何解析它到达那里的日期?你有没有调试过它到达服务器时是否仍然有所需的时间(但在它被写入数据库之前)? mySQL 服务器本身(不是 sequelize 连接)是否设置了时区?这里缺少很多信息。
-
我更新了关于我的问题的信息。我没有在 momentjs、fullcalendar 和 daterangepicker 上设置时区。当日期时间到达服务器时,它的格式与输入字段中的格式相同。
-
(new Date()).toISOString()将返回 UTC 日期时间(通过添加/减去时区偏移到本地时间... 18:30 - 05:30 = 01:00)。您没有发布剩余的详细信息。但是你可能可以使用 moment js 将本地日期时间转换为 MySQL 期望的格式。
标签: mysql datetime sequelize.js momentjs