访问时无法补偿时差 mysql
Unable to compensate for the time difference while accessing mysql
我将日期时间存储在 google 云 mysql 中作为 CURRENT_TIMESTAMP
。我使用 momentjs
和 knex
typeCast: 选项访问(Nodejs 服务器托管在 Google App Engine 中)并将它们转换为毫秒,然后再将响应发送回客户(android)。
数据库中的实际日期:2019-01-07 12:37:48
当我将日期转换为 MYSQL 日期格式时 Android 给出的结果:2019-01-07 15:37:48
注意 3 小时的差异。
我如何在 android 中进行转换:
public static SimpleDateFormat DB_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
public static SimpleDateFormat DB_FORMAT_UNCHANGED = new
SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
"updated_at", > DB_FORMAT_UNCHANGED.format(milliseconds);
"updated_at", > DB_FORMAT_UNCHANGED.format(milliseconds);//giving similar inaccurate result
问题: 自从 减去 + 3 GMT 偏移量效率不高
编辑:
服务器访问时是如何转换的,里面knex config
:
const config = {
user: 'user' ,
password: 'pwpw' ,
database: 'dbdb' ,
typeCast: function (field, next) {
if (field.type === 'JSON') {
return (JSON.parse(field.string()));
}
if (field.type === 'TINY' && field.length === 1) {
return (field.string() === '1');
}
if (field.type === 'DATETIME') {
return (moment(field.string()).valueOf());
}
return next();
}
};
您面临的问题是服务器正在 "some" 时区生成时间戳,可能是它的本地时间戳。您的客户端应用程序不知道它。该服务器时区将来甚至可能会更改。即使它没有变化,也可能会受到夏令时变化的影响。
使用 CURRENT_TIMESTAP
非常适合确保数据库始终记录正确的值。但是,在以后的查询中,当您需要按它过滤数据时,您的应用程序必须知道时区才能在查询中发送正确的值。
MySQL DATATIME
和 TIMESTAMP
数据类型没有替代变体 WITHOUT TIME ZONE
。您似乎需要其他数据库提供的这种数据类型。
考虑到这一点,我看到的解决方案是您在配置时将时区设置为特定的时区并进行相应的转换。也就是说,server 和 app 应该始终使用同一个。是的,我知道这不是你想要的,但你每次都需要执行时区转换。
在某些 ORM 中,您可以干预 "type converter" 以便在每个 insert/update/delete/select 上自动执行转换。也许您可以选择避免更改所有代码。
MYSQL returns DATETIME
列值没有时区偏移。因此,当客户端解释它们时,它们将被读取为客户端时区的本地时间。
您可以使用 TIMESTAMP
列类型来让您的时间始终使用时区进行解释,并始终获得一致的 unix 时间戳值,即使客户端的时区不同也是如此。
我将日期时间存储在 google 云 mysql 中作为 CURRENT_TIMESTAMP
。我使用 momentjs
和 knex
typeCast: 选项访问(Nodejs 服务器托管在 Google App Engine 中)并将它们转换为毫秒,然后再将响应发送回客户(android)。
数据库中的实际日期:2019-01-07 12:37:48
当我将日期转换为 MYSQL 日期格式时 Android 给出的结果:2019-01-07 15:37:48 注意 3 小时的差异。
我如何在 android 中进行转换:
public static SimpleDateFormat DB_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
public static SimpleDateFormat DB_FORMAT_UNCHANGED = new
SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
"updated_at", > DB_FORMAT_UNCHANGED.format(milliseconds);
"updated_at", > DB_FORMAT_UNCHANGED.format(milliseconds);//giving similar inaccurate result
问题: 自从 减去 + 3 GMT 偏移量效率不高
编辑:
服务器访问时是如何转换的,里面knex config
:
const config = {
user: 'user' ,
password: 'pwpw' ,
database: 'dbdb' ,
typeCast: function (field, next) {
if (field.type === 'JSON') {
return (JSON.parse(field.string()));
}
if (field.type === 'TINY' && field.length === 1) {
return (field.string() === '1');
}
if (field.type === 'DATETIME') {
return (moment(field.string()).valueOf());
}
return next();
}
};
您面临的问题是服务器正在 "some" 时区生成时间戳,可能是它的本地时间戳。您的客户端应用程序不知道它。该服务器时区将来甚至可能会更改。即使它没有变化,也可能会受到夏令时变化的影响。
使用 CURRENT_TIMESTAP
非常适合确保数据库始终记录正确的值。但是,在以后的查询中,当您需要按它过滤数据时,您的应用程序必须知道时区才能在查询中发送正确的值。
MySQL DATATIME
和 TIMESTAMP
数据类型没有替代变体 WITHOUT TIME ZONE
。您似乎需要其他数据库提供的这种数据类型。
考虑到这一点,我看到的解决方案是您在配置时将时区设置为特定的时区并进行相应的转换。也就是说,server 和 app 应该始终使用同一个。是的,我知道这不是你想要的,但你每次都需要执行时区转换。
在某些 ORM 中,您可以干预 "type converter" 以便在每个 insert/update/delete/select 上自动执行转换。也许您可以选择避免更改所有代码。
MYSQL returns DATETIME
列值没有时区偏移。因此,当客户端解释它们时,它们将被读取为客户端时区的本地时间。
您可以使用 TIMESTAMP
列类型来让您的时间始终使用时区进行解释,并始终获得一致的 unix 时间戳值,即使客户端的时区不同也是如此。