Google Fit会在错误的一天返回

时间:2017-05-01 23:35:38

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

我有一个用户遇到了一个奇怪的错误,但我没有预先存在的模型或想法它是如何发生的,并且我自己无法复制它。我们的应用程序从前一天的步骤价值中获取了Google Fit的API。用户的格林威治标准时间+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);
}

1 个答案:

答案 0 :(得分:0)

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

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