【问题标题】:Strongloop How to config mysql timezone?Strongloop 如何配置 mysql 时区?
【发布时间】:2015-12-22 02:52:17
【问题描述】:

我是 strongloop 的新手。我的 datasources.json 配置如下:

"platformDB": {
"host": "localhost",
"port": 3306,
"database": "way",
"username": "root",
"password": "root",
"name": "platformDB",
"connector": "mysql"
},

和 UserAccount 是我的一个模型如下:

"name": "UserAccount",
"plural": "user",
"base": "PersistedModel",
"idInjection": true,
"properties": {
"id": {
  "type": "number",
  "required": false
},
"accountName": {
  "type": "string",
  "required": false
},
"roleName": {
  "type": "string",
  "required": false
},
"accessToken": {
  "type": "string",
  "required": false
},
"loginTime": {
  "type": "date",
  "required": false,
  "mysql": {
    "dataType": "datetime"
  }
}

当我调用 UserAccount.create 和 UserAccount.findById 函数时,它们的结果还可以。但是当我通过客户端工具连接mysql数据库时,我发现'loginTime'值是UTC时间。这个结果与其他系统组件不协调,总之,我需要本地时间。 所以我跟踪 loopback-connector-mysql 源代码,我在数据源中找到 timezone 属性如下:

var options = {
host: s.host || s.hostname || 'localhost',
port: s.port || 3306,
user: s.username || s.user,
password: s.password,
timezone: s.timezone,
socketPath: s.socketPath,
charset: s.collation.toUpperCase(), // Correct by docs despite seeming odd.
supportBigNumbers: s.supportBigNumbers,
connectionLimit: s.connectionLimit
};

所以我在我的 datasources.json 中配置“timezone”:“utc8”,UserAccount.findById 函数结果等于客户端工具,但 UserAccount.create 函数结果仍然是 utc 时间。这是为什么?

【问题讨论】:

    标签: mysql timezone loopbackjs strongloop


    【解决方案1】:

    唯一的解决方案是修改核心文件。 编辑 /var/www/yourproject/node_modules/loopback-connector-mysql/lib/mysql.js

    改变

    function dateToMysql(val) {
      return val.getUTCFullYear() + '-' +
        fillZeros(val.getUTCMonth() + 1) + '-' +
        fillZeros(val.getUTCDate()) + ' ' +
        fillZeros(val.getUTCHours()) + ':' +
        fillZeros(val.getUTCMinutes()) + ':' +
        fillZeros(val.getUTCSeconds());
    
      function fillZeros(v) {
        return v < 10 ? '0' + v : v;
      }
    }
    

    ***function dateToMysql(val) {
      return val.getFullYear() + '-' +
        fillZeros(val.getMonth() + 1) + '-' +
        fillZeros(val.getDate()) + ' ' +
        fillZeros(val.getHours()) + ':' +
        fillZeros(val.getMinutes()) + ':' +
        fillZeros(val.getSeconds());
    
      function fillZeros(v) {
        return v < 10 ? '0' + v : v;
      }
    }***
    

    它将节省您的时间 别忘了投票 ;-)

    【讨论】:

      【解决方案2】:

      您还可以通过向数据源 JSON 配置添加时区条目来设置运行 API 的服务器的时区:

      datasources.json:

      {
        "mysqlDS": {
          "name": "mysqlDS",
          "connector": "mysql",
          "host": "localhost",
          "port": 3306,
          "database": "dbname",
          "username": "root",
          "password": "",
          "timezone": "UTC"
        }
      }
      

      然后可以使用环境变量在 datasources.local.js 中的生产环境上覆盖它:

      datasources.local.js:

      module.exports = {
        "mysqlDS": {
          host    : process.env.APP_MYSQL_HOST,
          port    : process.env.APP_MYSQL_PORT,
          database: process.env.APP_MYSQL_DB,
          username: process.env.APP_MYSQL_USER,
          password: process.env.APP_MYSQL_PW,
          timezone: process.env.APP_MYSQL_TZ
        }
      }
      

      也可以不签入 datasources.json 并使其成为所有环境的部署/构建配置的一部分。

      【讨论】:

        猜你喜欢
        • 2021-10-28
        • 1970-01-01
        • 2015-04-25
        • 2013-08-15
        • 1970-01-01
        • 2019-05-28
        • 1970-01-01
        • 2011-12-05
        • 2012-01-16
        相关资源
        最近更新 更多