当我在Sails上创建或更新记录时,它会在updateAt中写入以下内容:
updatedAt: 2014-07-06T15:00:00.000Z
但是我所在的时区是GMT+2小时(这个季节),并且更新是在16:00进行的。
我的模型中声明的所有日期时间字段都存在同样的问题。
我该如何在Sails(或者 eventual Express)中设置正确的时区?
经过数小时的研究,我解决这个问题的方法是:
在config/bootstrap.js
中添加以下代码:
process.env.TZ = 'UTC'; // 任何你想要的时区
我解决了这个问题,你应该在MySql选项文件中设置时区为UTC,在config/connections.js中进行设置,如下:
devMysqlServer: {
adapter: 'sails-mysql',
host: '127.0.0.1',
user: 'root',
password: '***',
database: '**',
timezone: 'utc'
},
new Date().toISOString()
,查看它设置的时间。它将基于isoDate 8601规范(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)。
现在,更改您的系统时区或仅更改时间上的小时并保存(如果您正在使用chrome控制台,则无需重新加载)。再次在控制台中运行命令new Date().toISOString()
,您将获得适合您刚刚更改的时间的调整后的时间。moment("2016-02-05T22:36:48.800Z").fromNow()
,您会注意到时间相对于系统时间。new Date('2014-07-06T15:00:00.000Z')
updatedAt
和createdAt
字段为您编码此时间戳;只需确保在保存任何自定义时间戳到数据库时始终使用时区,您就应该没问题!我已经明白了在应用程序级别不设置时区的原因(我理解为什么Sails的作者这样做),但是我一直在尝试执行一个简单的日期匹配查询。我认为,如果您使用默认的蓝图方法创建记录(其中包含比默认值多一个日期时间字段),并传递一个日期,则应该能够在获取查询中传递相同的日期并获取相同的记录。
例如,假设日期时间字段称为“specialdate”。如果我通过API创建一个新记录,并将“specialdate”设置为“06-09-2014”(忽略时间),那么我无法运行查找查询,以便可以传递“06-09-2014”并获取该记录。大于查询正常工作(如果我查找大于该日期的日期)。我确定这是时区偏移的问题,但一直没有想出解决方案。