为什么我的post请求PostgreSQL DB保存我的UTC DATETIME作为本地时间
Why does my post request to PostgreSQL DB save my UTC DATETIME as a local time
我正在向我的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);
}
});
}
}
};
这里是一个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
,当我发出get请求以检索值时,它将其作为字符串"2015-05-12T7:30:00.000Z"
那么无论我尝试做什么来改变字符串回一个日期对象的日期值最终等于2015-05-12 3:30 AM
。我尝试了Date.parse(<string>)
, new Date(<string>)
以及Moment.js的各种方法。即使在解析返回字符串之前切断返回字符串末尾的000Z
也没有什么区别。
我想返回的是我可以转换为代表发布时间的UTC/本地时间的epoch时间的东西。
Brad, sailespostgresql有时区问题,检查balderdash/sailespostgresql #153。与此相关联的是,我更改了travis ci构建以运行荷兰时区的sails-postgresql标准测试,这使得测试中断:https://travis-ci.org/balderdashy/sails-postgresql/jobs/59237954#L263.
如果我在上面输入像我原来的例子"2015-05-1213:30:00+00", "7:00 AM"返回2015年5月12日星期二03:30:00 GMT-0400(EDT),即UTC。
但是如果我在pgAdmin中打开表,它保存为2015-05-12 7:30:00+00
sail_postgresql(通过waterline-sequel)在将日期发送给PostgreSQL(相关代码)之前将其转换为UTC,这可能解释了你在pgAdmin中看到的内容。关于sails-postgresql行为的更多细节,请参阅此评论。
在balderdash/sails-postgresql#153中有一个更广泛的讨论,来弄清楚如何处理水线中的日期,以及如何修改sails-postgresql以适应这一点。
- 将当前时间添加到我的页面上的特定部分
- 将日期时间作为 JSON 发送将无法在我的视图中正确显示
- 我想用datetimepicker制作相关的时间字段
- 为什么我的上下文选择器和.buttonset()在ie中花费了这么长时间
- 我的时间倒计时脚本在谷歌浏览器中工作正常,但在其他浏览器中打开时它显示为南楠
- 为什么我的线没有随着时间的推移而画出来
- 在一天中的某个时间自动在我的网站上播放视频
- 如何将我的自定义时间选择器链接到我的asp.net
- 我将如何夸大(延长)使用javascript下载文件所需的时间
- 如何获取所有旅行模式的距离和持续时间,例如驾驶,公交,骑自行车,在我的页面中步行以及将其存储在数据库中
- 使用JavaScript将日期/时间添加到我的asp.net用户控件中
- 我能得到网页加载的时间吗
- 如何将时间戳注释添加到我的输出文件中
- 我的无引用 JavaScript 对象存在在哪里以及存在多长时间
- 为什么日期对象的时间没有改变?我怎样才能改变它
- 如果在一段时间不活动后4秒内开始加载,如何刷新我的网站
- Javascript 更改服务器给我的时间以匹配另一个时区
- 为什么我的时间格式在javaScript中不起作用
- highcharts把我的时间弄错了
- 什么是toIsoString()在时刻,为什么它给我的时间比当前时间少