关于javascript:为什么我对PostgreSQL DB的帖子请求将我的UTC DATETIME保存为本地时间

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,我在那里测试我的控制器逻辑在做什么。

如果我在顶部"2015-05-12 13:30:00+00","7:00 AM"输入类似我原始示例的内容,则返回Tue May 12 2015 03:30:00 GMT-0400 (EDT),即UTC。

但是,如果我在pgAdmin中打开表,它保存为2015-05-12 7:30:00+00,当我发出获取请求以检索值时,它将其作为字符串"2015-05-12T7:30:00.000Z"返回

然后,无论我尝试将该字符串更改回日期对象,日期值最终都等于2015-05-12 3:30 AM。我尝试了Date.parse()new Date()以及Moment.js的各种方法。即使在解析它之前切断返回字符串末尾的000Z也没有区别。

我想要返回的是我可以转换为一个纪元时间,表示发布时间的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以适应它。