Javascript 为什么我对PostgreSQL DB的post请求会将UTC日期时间保存为本地时间
我正在向我的Sails API传递一个对象,该对象有两个属性,其值分别为日期时间字符串(2015-05-12 13:30:00+00)和时间字符串(“7:00 AM”) 在我的Sails控制器中,我从日期时间字符串中删除原始时间,将时间字符串转换为24小时格式,并创建一个UTC日期对象以插入我的PostgreSQL数据库Javascript 为什么我对PostgreSQL DB的post请求会将UTC日期时间保存为本地时间,javascript,postgresql,datetime,sails.js,sails-postgresql,Javascript,Postgresql,Datetime,Sails.js,Sails Postgresql,我正在向我的Sails API传递一个对象,该对象有两个属性,其值分别为日期时间字符串(2015-05-12 13:30:00+00)和时间字符串(“7:00 AM”) 在我的Sails控制器中,我从日期时间字符串中删除原始时间,将时间字符串转换为24小时格式,并创建一个UTC日期对象以插入我的PostgreSQL数据库 module.exports = { toDateObj: function(req, res) { if (!req.param('jobSchedObj'
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);
}
});
}
}
};
module.exports={
toDateObj:功能(请求、恢复){
如果(!req.param('jobSchedObj')){
res.badRequest('缺少必需参数!');
}否则{
变量日期=请求参数('jobSchedObj')。计划日期;
var startTime=req.param('jobSchedObj')。计划启动时间;
var endTime=req.param('jobSchedObj')。计划结束时间;
var times={scheduled_start_time:startTime,scheduled_end_time:endTime};
var-toInsert=[];
var toInsertObj={};
for(以时间为单位的var时间){
//从日期开始的剥离时间
var dateRegex=/(\d{4})-(d{2})-(d{2})/g;
var thisDate=dateRegex.exec(日期);
//将新时间格式化为24小时格式
var小时数=次数[时间]。匹配(/^(\d+/)[1]);
var minutes=Number(次数[时间])。匹配(/:(\d+/)[1]);
var AP=times[time]。匹配(/\s(.*)$/);
如果(!AP){
AP=次数[时间]。切片(-2);
}否则{
AP=AP[1]
}
如果(AP==“PM”&&小时数<12){
小时=小时+12
}
如果(AP==“AM”&&H==12){
小时=小时-12
}
var Hours24=hours.toString();
var Minutes24=minutes.toString();
如果(小时<10){
小时24=“0”+小时24
}
如果(分钟<10){
分钟24=“0”+分钟24
}
//使用日期指定新的24小时时间并创建日期对象
toInsertObj[time]=新日期(Date.UTC(parseInt)(thisDate[1]),
parseInt(本日期[2])-1,
parseInt(本日期[3]),
parseInt(小时24),
parsent(分钟24));
}
toInsertObj.allocated_time=req.param('jobSchedObj')。allocated_time;
toInsertObj.repair\u shop\u equipment\u id=需求参数('jobSchedObj')。repair\u shop\u equipment\u id;
toInsertObj.technician_id=请求参数('jobSchedObj')。technician_id;
toInsertObj.repair\u history\u id=req.param('jobSchedObj')。repair\u history\u id;
toInsertObj.repair\u shop\u id=请求参数('jobSchedObj')。repair\u shop\u id;
toInsert.push(toInsertObj);
创建(toInsert,函数(err,计划){
如果(错误){
res.send(err);
}否则{
res.send(附表);
}
});
}
}
};
这是一个我测试控制器逻辑的地方
如果我在顶部输入类似于我的原始示例的内容“2015-05-12 13:30:00+00”,“7:00 AM”,它将返回2015年5月12日星期二03:30:00 GMT-0400(EDT),即UTC
但如果我在pgAdmin中打开该表,它将另存为2015-05-12 7:30:00+00
,当我发出get请求以检索该值时,它会将其作为字符串带回来“2015-05-12T7:30:00.000Z”
然后,无论我如何尝试将该字符串更改回日期对象,日期值最终都相当于2015-05-12凌晨3:30
。我尝试了date.parse()
,new date()
以及Moment.js的各种方法。即使在解析返回字符串之前切断返回字符串末尾的000Z
,也没有什么区别
我想返回的是我可以转换为表示发布时间的UTC/本地时间的历元时间。Brad,sails postgresql存在时区问题,请检查。与此相关的是,我已更改travis ci构建以在荷兰时区运行sails postgresql标准测试,这使测试中断: 如果我在顶部“2015-05-12”输入类似于我的原始示例的内容 13:30:00+00,“7:00 AM”返回2015年5月12日星期二03:30:00 GMT-0400 (EDT)即UTC 但如果我在pgAdmin中打开表,它将保存为2015-05-12 7:30:00+00 sails postgresql(通过waterline sequel)在将日期发送到postgresql()之前将日期转换为UTC,这可能会解释您在pgAdmin中看到的内容。有关sails postgresql行为的更多详细信息,请参阅
关于如何在waterline中处理日期以及如何更改sails postgresql以适应这一点,在中进行了更广泛的讨论。这不是对您问题的回答,但可能会有所帮助。我发现,从一个框架跳到另一个框架,从一个数据库跳到另一个数据库,我现在将所有日期存储为INT,然后在数据库中转换回来使用Moment.js之类的库在服务器/客户机上创建日期。这对我帮助很大,因为日期可以在DB级别和DB连接级别(适配器)进行操作,在服务器上,然后在本地客户端上,这取决于您是否使用js框架显示日期。最终,我厌倦了,并通过保存为INT解决了所有这些难题。感谢@Dário,我已将此帖子链接到。在解决此问题之前,我一直处于停顿状态。如果有什么可以帮助我更快地找到解决方案的话我会的。但问题似乎是众所周知的,只是讨论解决方案的方向。不客气。这是一个痛苦的问题,因为无论实施什么更改,都无法破坏现有用户的行为,因为人们可能已经围绕这个问题编写了代码。理想情况下,解决方案应该允许(通过配置)恢复到当前的行为。