Javascript 为什么我对PostgreSQL DB的post请求会将UTC日期时间保存为本地时间

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'

我正在向我的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')) {
        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,我已将此帖子链接到。在解决此问题之前,我一直处于停顿状态。如果有什么可以帮助我更快地找到解决方案的话我会的。但问题似乎是众所周知的,只是讨论解决方案的方向。不客气。这是一个痛苦的问题,因为无论实施什么更改,都无法破坏现有用户的行为,因为人们可能已经围绕这个问题编写了代码。理想情况下,解决方案应该允许(通过配置)恢复到当前的行为。