访问mysql时无法补偿时间差



我将日期时间存储在谷歌云中mysql作为CURRENT_TIMESTAMP。我使用momentjsknextypeCast:选项(谷歌应用引擎中托管的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();
}
};

MYSQL返回不带时区偏移的DATETIME列值。因此,当客户端解释它们时,它们将被读取为客户端时区的本地时间。

您可以使用TIMESTAMP列类型来获取始终用时区解释的时间,并获取unix时间戳的始终一致的值,即使客户端的时区不同。

您面临的问题是,服务器正在"某个"时区生成时间戳,可能是它的本地时区。您的客户端应用程序没有意识到这一点。该服务器时区甚至可能在未来发生更改。即使它没有改变,也可能受到夏令时变化的影响。

使用CURRENT_TIMESTAP可以确保数据库始终记录正确的值。但是,在以后的查询中,当您需要根据它过滤数据时,您的应用程序必须知道时区,以便在查询中发送正确的值。

MySQLDATATIMETIMESTAMP数据类型没有备选变体WITHOUT TIME ZONE。您似乎需要其他数据库提供的这种数据类型。

考虑到这一点,我看到的解决方案是在配置时将时区设置为特定的时区,并进行相应的转换。也就是说,服务器应用程序应始终使用相同的服务器。是的,我知道这不是你想要的,但你每次都需要执行时区转换。

在某些ORM中,您可以干预"类型转换器",以便在每次插入/更新/删除/选择时自动执行转换。也许您可以选择此选项来避免更改所有代码。

相关内容

  • 没有找到相关文章

最新更新