访问mysql

时间:2019-01-07 16:00:30

标签: android mysql momentjs google-cloud-sql knex.js

我将日期时间作为CURRENT_TIMESTAMP存储在Google云 mysql 中。我使用momentjsknex 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();
        }
    };

2 个答案:

答案 0 :(得分:1)

您面临的问题是服务器正在“某些”时区(可能是本地时区)中生成时间戳。您的客户端应用程序不知道它。该服务器所在的时区甚至将来可能会更改。即使它没有变化,也可能会受到夏时制时间的影响。

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

MySQL DATATIMETIMESTAMP数据类型没有替代变体WITHOUT TIME ZONE。您似乎需要其他数据库提供的这种数据类型。

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

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

答案 1 :(得分:1)

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

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