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