Why does my post request to PostgreSQL DB save my UTC DATETIME as a local time
我将一个对象传递给我的Sails API,该API具有两个属性,其值分别为日期时间字符串(2015-05-12 13:30:00 + 00")和时间字符串("7:00 AM") 。
在我的Sails控制器中,我从日期时间字符串中删除原始时间,将时间字符串转换为24小时格式,并创建一个UTC日期对象以插入我的PostgreSQL数据库。这是控制器代码;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | module.exports = { toDateObj: function(req, res) { if (!req.param('jobSchedObj')) { res.badRequest('Missing required parameter!'); } else { var date = req.param('jobSchedObj').scheduled_date; var startTime = req.param('jobSchedObj').scheduled_start_time; var endTime = req.param('jobSchedObj').scheduled_end_time; var times = {scheduled_start_time: startTime, scheduled_end_time: endTime}; var toInsert = []; var toInsertObj = {}; for (var time in times) { //Strip time from date var dateRegex = /(\d{4})-(\d{2})-(\d{2})/g; var thisDate = dateRegex.exec(date); //format new time to 24-hour format var hours = Number(times[time].match(/^(\d+)/)[1]); var minutes = Number(times[time].match(/:(\d+)/)[1]); var AP = times[time].match(/\s(.*)$/); if (!AP) { AP = times[time].slice(-2); } else { AP = AP[1] } if (AP =="PM" && hours < 12) { hours = hours + 12 } if (AP =="AM" && hours == 12) { hours = hours - 12 } var Hours24 = hours.toString(); var Minutes24 = minutes.toString(); if (hours < 10) { Hours24 ="0" + Hours24 } if (minutes < 10) { Minutes24 ="0" + Minutes24 } //Concat new 24-hour time with date and create Date Obj toInsertObj[time] = new Date(Date.UTC(parseInt(thisDate[1]), parseInt(thisDate[2]) - 1, parseInt(thisDate[3]), parseInt(Hours24), parseInt(Minutes24))); } toInsertObj.allotted_time = req.param('jobSchedObj').allotted_time; toInsertObj.repair_shop_equipment_id = req.param('jobSchedObj').repair_shop_equipment_id; toInsertObj.technician_id = req.param('jobSchedObj').technician_id; toInsertObj.repair_history_id = req.param('jobSchedObj').repair_history_id; toInsertObj.repair_shop_id = req.param('jobSchedObj').repair_shop_id; toInsert.push(toInsertObj); Schedules.create(toInsert, function (err, schedules){ if (err) { res.send(err); } else { res.send(schedules); } }); } } }; |
这是一个CodePen,我在那里测试我的控制器逻辑在做什么。
如果我在顶部
但是,如果我在pgAdmin中打开表,它保存为
然后,无论我尝试将该字符串更改回日期对象,日期值最终都等于
我想要返回的是我可以转换为一个纪元时间,表示发布时间的UTC /本地。
Brad,sails-postgresql有时区问题,请查看balderdashy / sails-postgresql#153。 与之相关的我已经改变了travis ci构建以在荷兰时区运行sails-postgresql标准测试并且使测试中断:https://travis-ci.org/balderdashy/sails-postgresql/jobs/59237954#L263。
If I input something like my original example at the top"2015-05-12
13:30:00+00","7:00 AM" it returns Tue May 12 2015 03:30:00 GMT-0400
(EDT) which is UTC.But if I open the table in pgAdmin It saves as 2015-05-12 7:30:00+00
sails-postgresql(通过waterline-sequel)将日期转换为UTC,然后将它们发送到PostgreSQL(相关代码),这可以解释您在pgAdmin中看到的内容。 有关此注释中sails-postgresql行为的更多详细信息。
在balderdashy / sails-postgresql#153中有一个更广泛的讨论,以弄清楚如何处理水线中的日期以及如何更改sails-postgresql以适应它。