Шаги Google Fit возвращаются не в тот день

У меня есть пользователь, который столкнулся со странной ошибкой, но у меня нет готовой модели или представления о том, как это происходит, и я не могу воспроизвести ее самостоятельно. Наше приложение получает из API Google Fit значение шагов за предыдущий день. Пользователь находится в 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);
}

person Sergio Prado    schedule 01.05.2017    source источник
comment
6 * 24 * 60 * 60 * 1000), // seven days ago вы уверены, что это правильно?   -  person Andy Turner    schedule 04.05.2017


Ответы (1)


На основе этой темы убедитесь, что настройки вашего часового пояса с обеих сторон совпадают и соответствуют вашему текущему местоположению, а также любым изменениям летнего времени в вашем регионе.

Вот связанная тема, которая также может помочь: API Google FIT возвращает разное количество шагов

person abielita    schedule 02.05.2017