Datetime 如何在Sails.js或Express.js中设置本地时区

Datetime 如何在Sails.js或Express.js中设置本地时区,datetime,express,timezone,timestamp,sails.js,Datetime,Express,Timezone,Timestamp,Sails.js,当我在sails上创建或更新记录时,它会在updateeat中写入以下内容: updatedAt: 2014-07-06T15:00:00.000Z 但我在格林尼治标准时间+2小时(本季),更新时间为16:00 我的模型中声明的所有datetime字段都有同样的问题 如何在帆船(或最终快车)上设置正确的时区?试图通过在服务器上设置时区来解决问题有点短视。如果你搬家怎么办?或者其他国家/地区的人访问您的应用程序?重要的是,数据库中的时间戳有一个编码的时区,这样您就可以在前端转换到正确的时间。也就

当我在sails上创建或更新记录时,它会在updateeat中写入以下内容:

updatedAt: 2014-07-06T15:00:00.000Z
但我在格林尼治标准时间+2小时(本季),更新时间为16:00

我的模型中声明的所有datetime字段都有同样的问题


如何在帆船(或最终快车)上设置正确的时区?

试图通过在服务器上设置时区来解决问题有点短视。如果你搬家怎么办?或者其他国家/地区的人访问您的应用程序?重要的是,数据库中的时间戳有一个编码的时区,这样您就可以在前端转换到正确的时间。也就是说,如果您这样做:

new Date('2014-07-06T15:00:00.000Z')

在浏览器控制台中,您应该可以看到它为您所在的位置显示正确的日期和时间。Sails使用默认的
updatedAt
createdAt
字段自动为您编码此时间戳;只要确保在将任何自定义时间戳保存到数据库时始终使用时区,就可以了

我已经习惯了不在应用程序级别设置时区(我明白为什么sails的作者会这样做),但是我一直很难执行简单的日期匹配查询。我假设,如果您使用默认的blueprint方法(这个方法在默认值上包含一个额外的datetime字段)创建一个记录,并传入一个日期,那么您就能够在get查询中传入相同的日期并获取相同的记录


例如,假设datetime字段称为“specialdate”。如果我通过api创建了一个新记录,其“specialdate”等于“06-09-2014”(忽略时间),我就无法运行查找查询,在该查询中我可以传递“06-09-2014”并取回该记录。大于查询可以正常工作(如果我查找的日期大于该日期)。我确信这是一个时区偏移问题,但还没有找到解决方案。

我解决了这个问题,您应该设置MySql选项文件以将时区更改为UTC 在config/connections.js中 设定在这个

devMysqlServer:{
适配器:“sails mysql”,
主持人:“127.0.0.1”,
用户:'根',
密码:'***',
数据库:'**',
时区:“utc”
},

IMO,这里最好的架构规划是继续使用Sails.js isoDate格式。当用户加载网站/应用程序时,isoDate将转换为其客户端/浏览器时区,该时区通常在操作系统级别设置

这里有一个例子,你可以用它来测试。打开浏览器控制台,运行
newdate().toISOString()
,查看它设置的时间。它将基于isoDate 8601()的非规范。 现在,将系统时间更改为不同的时区,或者只需更改时间上的小时数并保存(如果使用chrome控制台,则不必重新加载)。再次在控制台中运行您的命令
new Date().toISOString()
,您将得到一个与您刚刚更改的时间相适应的调整时间


如果您想继续向自己证明time Sails.js适合使用,请在数据库(由waterline ORM创建)中存储的isoDate上使用Moment.js,如
Moment(“2016-02-05T22:36:48.800Z”)。fromNow()
您会注意到时间是相对于系统时间的。

经过数小时的研究后,我处理问题的方式:

process.env.TZ='UTC'//您想要的任何时区


config/bootstrap.js

中,设置应用程序工作的服务器上的本地时间。不是吗?当我在开发环境中运行时,它工作,但在生产环境中不工作