我在google云mysql中存储日期和时间 CURRENT_TIMESTAMP
. 我使用 momentjs
与 knex
typecast:option(googleappengine中托管的nodejs服务器)并将其转换为毫秒,然后将响应发送回客户端(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();
}
};
2条答案
按热度按时间b91juud31#
mysql返回
DATETIME
不带时区偏移的列值。因此,当客户端解释它们时,它们将被读取为客户端时区的本地时间。你可以用
TIMESTAMP
列类型,以便始终使用时区解释时间,并且即使客户端的时区不同,也始终为unix时间戳获取一致的值。k7fdbhmy2#
您面临的问题是,服务器正在“某个”时区生成时间戳,可能是它的本地时间戳。您的客户端应用程序不知道它。服务器时区将来甚至可能会改变。即使没有变化,也可能会受到夏令时变化的影响。
使用
CURRENT_TIMESTAP
确保数据库总是记录正确的值是很好的。但是,在以后的查询中,当需要按时区过滤数据时,应用程序必须知道时区,才能在查询中发送正确的值。mysql数据库
DATATIME
以及TIMESTAMP
数据类型没有可选的变体WITHOUT TIME ZONE
. 您似乎需要其他数据库提供的这种数据类型。考虑到这一点,我看到的解决方案是在配置时将时区设置为一个特定的时区,并进行相应的转换。也就是说,服务器和应用程序应该一直使用同一个。是的,我知道这不是你想要的,但是你每次都需要执行时区转换。
在某些orms中,您可以干预“类型转换器”,以便在每次插入/更新/删除/选择时自动执行转换。也许你有这个选择来避免改变你所有的代码。