我有一个用户遇到了一个奇怪的错误,但我没有预先存在的模型或想法它是如何发生的,并且我自己无法复制它。我们的应用程序从前一天的步骤价值中获取了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);
}
答案 0 :(得分:0)
根据此thread,确保双方的时区设置与当前位置匹配且正确,以及您所在地区夏令时的任何变化。
这是一个可能也有帮助的相关主题:Google FIT api returns different step counts