Javascript 日期时间与 MySQL 日期和时区

Javascript DateTime vs. MySQL Date and Time Zones

我有一个 web/phonegap 应用程序,它使用 angular + angular-bootstrap 的版本(分别为 1.2.x 和 0.10.0)。

在客户端我有一个日期选择器(datepicker-popup)。

在服务器端我有 sails.js 与 MySQL 数据库一起工作。

我的模型(服务器端)有一个日期字段(MyModel.js):

   module.exports = {
    schema: true,
    attributes: {
        date: {
            type: 'date',
            required: true
        },
        ...
    }
   }

现在我有以下问题:

在客户端我select约会。我正在获取 js 数据。我的时区是 +2,所以如果我在 UI 中选择 2016-01-12,我会得到 '2016-01-11T22:00:00Z'(这是同一时间,但采用 UTC)。

现在这被发送到服务器并存储在数据库中。

在本地工作时,我看到“2016-01-12”保存在数据库的 date 列中。当我使用远程服务器时,保存的日期是“2016-01-11”(服务器位于欧盟西部的 AWS - 我相信是爱尔兰)。

当我再次在客户端检索该日期时,我得到了错误的日期 ('2016-01-11T00:00:00Z')。

我相信这与服务器的时区和数据被截断有关 - 它没有保存完整的 UTC 日期+时间,而是只保存日期,当我在客户端检索和解析时'2016-01-11T00:00:00Z' == '2016-01-11T02:00:00+2:00') 这是错误的日期:/

除了将 schema/model 更改为完整日期时间(我假设保留完整日期并在客户端检索时正确解析)之外,我不确定我还有哪些其他选项。

还有其他解决方案吗?

编辑:

正如我在下面写的那样进行转换:

var dd = moment.utc(moment(d).format("YYYY-MM-DDTHH:mm:ss")).toDate()

获取当地时间,但为 UTC。 (我认为对于 UTC 之前的时区(例如 +2)这种 "solves" 问题。不确定其他方式)

例如,它会将 '2016-01-12T00:00:00+2:00' (== '2016-01-11T22:00:00Z') 转换为 '2016-01-12T00:00:00Z' 但这种技巧并非在所有情况下都有效。

您的模型应该使用 datetime 类型而不仅仅是 date 并且您应该始终以 UTC 格式存储,客户端应该负责在用户的时区中显示它。

module.exports = {
  schema: true,
  attributes: {
    date: {
      type: 'datetime',
      required: true
    }
  }
}