我将日期时间存储在谷歌云mysql中作为CURRENT_TIMESTAMP
。我使用 momentjs
和 knex
typeCast: 选项(托管在 Google App Engine 中的 Nodejs 服务器)进行访问,并将响应发送回客户端之前将它们转换为毫秒(安卓)。
数据库中的真实日期: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();
}
};
最佳答案
MYSQL 返回没有时区偏移的 DATETIME
列值。因此,当客户端解释它们时,它们将被读取为客户端时区的本地时间。
您可以使用 TIMESTAMP
列类型来始终使用时区解释您的时间,并获得始终一致的 unix 时间戳值,即使客户端的时区不同。
关于android - 无法补偿访问mysql时的时差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54077727/