我创建了一个node.js应用程序,它从远程数据库获取一些数据并处理它。其中一些数据是Date对象。当我从家里的本地站查询远程数据库时,假设数据库中的数据是{ dateOfEvent: "2014-04-13T00:00:00.000Z" }
,我得到的响应是{ dateOfEvent: "2014-04-12T21:00:00.000Z" }
,对应于我的tymezone的utc偏移量。如果我从托管我的应用的云计算机发出相同的请求,则其获得的响应为{ dateOfEvent: "2014-04-13T04:00:00.000Z" }
,与其GMT-4时区相对应。
节点是否进行了一些自动日期时间转换,或者是节点的mysql驱动程序?
答案 0 :(得分:3)
我遇到了同样的问题。它看起来像node.js的mysql模块只需要MySQL返回的任何日期时间字符串和IGNORES可能存在的时区信息(例如,通常Z出现在" Zulu时间")。生成的timezone free datetime字符串随后会显示给Date()构造函数,并作为LOCAL日期时间返回给您。
即如果您的数据库以UTC时区存储日期,则node.js MySQL查询将返回例如" 2013-09-08T21:39:31.000Z"。 现在,如果进行查询的本地计算机位于GMT + 7时区,则node.js和mysql模块会将该日期字符串设置为IN LOCAL时区并调用Date(" 2013-09-08T21 :格林威治标准时间39:31.000 GMT-0700")关于该字符串产生" 2013-09-09T04:39:31 UTC" ...
您可以通过将从MySQL收到的所有日期时间移动到当地时间UTC的时间来更正本地TZ代码中的内容。 (例如,如果您在GMT-7中),您必须将所有MySQL日期移回7个小时(再次假设您的MySQL数据库是UTC时区)。
...
var tz_offset = (new Date()).getTimezoneOffset() * 60 * 1000; // get TZ offset in milliseconds
var corrected_datetime = new Date(mysql_datetime.getTime() - tz_offset); // now corrected
希望这有帮助