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

6
当我在Sails上创建或更新记录时,它会在updateAt中写入以下内容:
updatedAt: 2014-07-06T15:00:00.000Z

但是我所在的时区是GMT+2小时(这个季节),并且更新是在16:00进行的。

我的模型中声明的所有日期时间字段都存在同样的问题。

我该如何在Sails(或者 eventual Express)中设置正确的时区?


在您的应用程序所在的服务器上设置本地时间。是这样吗? - diproart
5个回答

11

经过数小时的研究,我解决这个问题的方法是:

config/bootstrap.js中添加以下代码:

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


在开发环境下运行时它是有效的,但在生产环境中它无法正常工作。 - Arshad

3

我解决了这个问题,你应该在MySql选项文件中设置时区为UTC,在config/connections.js中进行设置,如下:

devMysqlServer: {
    adapter: 'sails-mysql',
    host: '127.0.0.1',
    user: 'root',
    password: '***',
    database: '**',
    timezone: 'utc'
  },

1
在我看来,最好的架构规划是继续使用Sails.js的isoDate格式。当用户加载您的网站/应用程序时,isoDate将被转换为他们客户端/浏览器的时区,通常设置在操作系统级别。
以下是一个示例,您可以测试一下。打开浏览器控制台并运行new Date().toISOString(),查看它设置的时间。它将基于isoDate 8601规范(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)。 现在,更改您的系统时区或仅更改时间上的小时并保存(如果您正在使用chrome控制台,则无需重新加载)。再次在控制台中运行命令new Date().toISOString(),您将获得适合您刚刚更改的时间的调整后的时间。
如果您想继续证明Sails.js的适用性,请在数据库中使用Moment.js处理存储的isoDate(由Waterline ORM创建),如下所示:moment("2016-02-05T22:36:48.800Z").fromNow(),您会注意到时间相对于系统时间。

1
尝试通过在服务器上设置时区来解决问题有些短视。如果你搬家了呢?或者其他国家的人访问你的应用程序呢?重要的是数据库中的时间戳已经编码了时区,这样你就可以在前端将其转换为正确的时间。也就是说,如果你这样做:
new Date('2014-07-06T15:00:00.000Z')

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

0

我已经明白了在应用程序级别不设置时区的原因(我理解为什么Sails的作者这样做),但是我一直在尝试执行一个简单的日期匹配查询。我认为,如果您使用默认的蓝图方法创建记录(其中包含比默认值多一个日期时间字段),并传递一个日期,则应该能够在获取查询中传递相同的日期并获取相同的记录。

例如,假设日期时间字段称为“specialdate”。如果我通过API创建一个新记录,并将“specialdate”设置为“06-09-2014”(忽略时间),那么我无法运行查找查询,以便可以传递“06-09-2014”并获取该记录。大于查询正常工作(如果我查找大于该日期的日期)。我确定这是时区偏移的问题,但一直没有想出解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接