Javascript DateTime与MySQL日期和时区

时间:2016-01-11 16:00:32

标签: javascript mysql angularjs sails.js

我有一个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
        },
        ...
    }
   }

现在我有以下问题:

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

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

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

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

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

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

还有其他解决方案吗?

修改

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

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

获取本地时间,但为UTC。 (我认为对于UTC之前的时区(例如+2),这种"解决了问题。不确定另一种方式)

例如,它会将'2016-01-12T00:00:00+2:00'(== '2016-01-11T22:00:00Z')转换为'2016-01-12T00:00:00Z',但这是一种在任何情况下都无法工作的黑客。

1 个答案:

答案 0 :(得分:1)

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

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