我将日期时间作为CURRENT_TIMESTAMP
存储在Google云 mysql 中。我使用momentjs
和knex
的 typeCast:选项(Google App Engine中托管的Nodejs服务器)进行访问,并将它们转换为毫秒,然后将响应发送回客户端(android)。
数据库中的实际日期: 2019-01-07 12:37:48
当我将日期转换为MYSQL日期格式时Android提供的内容: 2019-01-07 15:37:48 请注意三个小时之间的时差。
我如何在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偏移效率不高,我该如何解决我的应用程序用户前往世界各地的日期准确性问题? / strong>
编辑:
在服务器内部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();
}
};
答案 0 :(得分:1)
您面临的问题是服务器正在“某些”时区(可能是本地时区)中生成时间戳。您的客户端应用程序不知道它。该服务器所在的时区甚至将来可能会更改。即使它没有变化,也可能会受到夏时制时间的影响。
使用CURRENT_TIMESTAP
可以确保数据库始终记录正确的值。但是,在以后的查询中,当您需要按其过滤数据时,您的应用程序必须知道时区以在查询中发送正确的值。
MySQL DATATIME
和TIMESTAMP
数据类型没有替代变体WITHOUT TIME ZONE
。您似乎需要其他数据库提供的这种数据类型。
考虑到这一点,我看到的解决方案是在配置时将时区设置为特定的时区,然后进行相应的转换。也就是说,服务器和应用应始终使用相同的服务器。是的,我知道这不是您想要的,但是您每次都需要执行时区转换。
在某些ORM中,您可以干预“类型转换器”,以便在每次插入/更新/删除/选择时自动执行转换。也许您可以使用此选项来避免更改所有代码。
答案 1 :(得分:1)
MYSQL返回DATETIME
列值,没有时区偏移。因此,当客户解释它们时,它们将被读取为客户所在时区的本地时间。
您可以改用TIMESTAMP
列类型,以始终用时区来解释您的时间,并且即使客户端的时区不同,也可以获得unix时间戳的始终一致的值。