【问题标题】:Google Fit steps returning for wrong day错误日期返回的 Google Fit 步数
【发布时间】:2017-05-04 00:14:24
【问题描述】:

我有一个用户遇到了一个奇怪的错误,但我没有预先存在的模型或关于它如何发生的想法,并且无法自己复制它。我们的应用程序从 Google Fit 的 API 获取前一天的步数值。用户在 GMT +5,但是当我从那个时区进行测试时,我无法复制该问题,我的应用程序在 GMT +X 时区的其他用户也不会遇到此问题。

目前我什至不知道从哪里开始寻找/我可以提供哪些额外信息来帮助解决这个问题。我们用来提取步骤值的代码如下。任何帮助,甚至是关于其他有用数据的任何提示/问题都会很棒。

代码流

Javascript:这是一个使用PhoneGap的混合应用,所以它以javascript开始和结束。传递的相关字段有 startDate、endDate 和 bucket:

navigator.health.queryAggregated({
    startDate: new Date(new Date().getTime() - 6 * 24 * 60 * 60 * 1000), // seven days ago
    endDate: new Date(), // now
    dataType: 'steps',
    bucket: 'day'
    }, 
    function(data){
        data.forEach(function(data_entry){
            var date = new Date(data_entry.startDate).toISOString().substring(0, 10);
            steps_record[date] = data_entry.value;
        })
    }
)

Java: Java 代码是实际检索步骤值的位置,由 startDate/st、endDate/et 和 bucket/hasbucket 确定的日期分桶。

long st = args.getJSONObject(0).getLong("startDate");
long et = args.getJSONObject(0).getLong("endDate");
String datatype = args.getJSONObject(0).getString("dataType");

boolean hasbucket = args.getJSONObject(0).has("bucket");
boolean customBuckets = false;
String bucketType = "";
if (hasbucket) {
    bucketType = args.getJSONObject(0).getString("bucket");

    Calendar c = Calendar.getInstance();

    c.setTimeInMillis(st);
    c.clear(Calendar.MINUTE);
    c.clear(Calendar.SECOND);
    c.clear(Calendar.MILLISECOND);
    if (!bucketType.equalsIgnoreCase("hour")) {
            c.set(Calendar.HOUR_OF_DAY, 0);
        if (bucketType.equalsIgnoreCase("week")) {
            c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek());
        } else if (bucketType.equalsIgnoreCase("month")) {
            c.set(Calendar.DAY_OF_MONTH, 1);
        } else if (bucketType.equalsIgnoreCase("year")) {
            c.set(Calendar.DAY_OF_YEAR, 1);
        }
    }
    st = c.getTimeInMillis();

    c.setTimeInMillis(et);
    c.clear(Calendar.MINUTE);
    c.clear(Calendar.SECOND);
    c.clear(Calendar.MILLISECOND);
    if (bucketType.equalsIgnoreCase("hour")) {
        c.add(Calendar.HOUR_OF_DAY, 1);
    } else {
        c.set(Calendar.HOUR_OF_DAY, 0);
        if (bucketType.equalsIgnoreCase("day")) {
            c.add(Calendar.DAY_OF_YEAR, 1);
        } else if (bucketType.equalsIgnoreCase("week")) {
            c.add(Calendar.DAY_OF_YEAR, 7);
        } else if (bucketType.equalsIgnoreCase("month")) {
            c.add(Calendar.MONTH, 1);
        } else if (bucketType.equalsIgnoreCase("year")) {
            c.add(Calendar.YEAR, 1);
        }
    }
    et = c.getTimeInMillis();
}

DataReadRequest.Builder builder = new DataReadRequest.Builder();
builder.setTimeRange(st, et, TimeUnit.MILLISECONDS);
int allms = (int) (et - st);

if (hasbucket) {
    if (bucketType.equalsIgnoreCase("hour")) {
        builder.bucketByTime(1, TimeUnit.HOURS);
    } else if (bucketType.equalsIgnoreCase("day")) {
        builder.bucketByTime(1, TimeUnit.DAYS);
    } else {
        // use days, then will need to aggregate manually
        builder.bucketByTime(1, TimeUnit.DAYS);
    }
} else {
    builder.bucketByTime(allms, TimeUnit.MILLISECONDS);
}

【问题讨论】:

  • "6 * 24 * 60 * 60 * 1000), // seven days ago" 你确定这是对的吗?

标签: android google-fit google-fit-sdk


【解决方案1】:

根据此thread,确保双方的时区设置与您当前的位置以及您所在地区夏令时的任何变化相匹配并正确无误。

这是一个相关的帖子,可能也有帮助:Google FIT api returns different step counts

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    相关资源
    最近更新 更多