android - 无法补偿访问mysql时的时差

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

我将日期时间存储在谷歌云mysql中作为CURRENT_TIMESTAMP。我使用 momentjsknex 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/

相关文章:

javascript - Moment.js 中的弃用警告 - 不是公认的 ISO 格式

java - 如何在 Android 应用程序中在 TextView 中随机分配 int[] 的每个数字一次

java - Android Wear 智能 watch 中的按钮

php - Laravel背包关系疑惑

Mysql 多连接查询

javascript - momentjs toDate() 日期返回与 format() 日期不同

android - 如何在 android 中有效且不损失质量的情况下调整位图的大小

android - 相对布局中的线性布局?

javascript - 如何弹出一个带有文本框的javascript警告框来更新mysql表?

Javascript:如何从 UTC 字符串和偏移量解析日期?