Как сделать время начала и окончания с 12 до 12 утра? - PullRequest
0 голосов
/ 08 ноября 2018

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

вот код:

        Calendar cal = Calendar.getInstance();
        Date today = new Date();
        cal.setTime(today);
        long endTime = cal.getTimeInMillis();
        cal.add(Calendar.MONTH, -1);
        long startTime = cal.getTimeInMillis();

        java.text.DateFormat dateFormat = DateFormat.getDateInstance();
        Log.e("History", "Range Start: " + dateFormat.format(startTime));
        Log.e("History", "Range End: " + dateFormat.format(endTime));

//Check how many steps were walked and recorded in the last 7 days
        final DataReadRequest readRequest = new DataReadRequest.Builder()
                .aggregate(DataType.TYPE_STEP_COUNT_DELTA, DataType.AGGREGATE_STEP_COUNT_DELTA)
                .bucketByTime(1, TimeUnit.DAYS)
                .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
                .build();

        final DataReadResult dataReadResult = Fitness.HistoryApi.readData(mGoogleApiClient, readRequest).await(1,TimeUnit.MINUTES);

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Если вам нужно начало дня, вы должны установить его следующим образом:

Calendar cal = new GregorianCalendar();
cal.clear(Calendar.HOUR); cal.clear(Calendar.AM_PM);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
// after all this we'd have the start of day.
// works good if extracted to separate method, which is the unfortunate truth of working with  old calendar classes

// minus one milli because Fit API treats includes end of range
long end = cal.getTimeInMillis() - 1;

cal.add(Calendar.MONTH, -1);
long start = cal.getTimeInMillis();

Я также могу предложить импортировать и использовать для этого библиотеку Joda (предпочитаю версию для Android).Используя Joda (и пакет java.time, как только Java 8 станет доступным на Fit, с небольшими изменениями), вы можете написать эквивалентный код, подобный этому:

DateTime date = LocalDate.now().toDateTimeAtStartOfDay();

long end = date.getMillis() - 1;

long start = date.minusMonths(1).getMillis();
0 голосов
/ 10 ноября 2018

java.time

Вы используете ужасные старые классы даты и времени, которые были вытеснены несколько лет назад классами java.time , определенными в JSR 310 .

LocalDate

Сначала получите интересующую дату. Если вы хотите «сегодня», вы должны указать часовой пояс.

Класс LocalDate представляет значение только для даты без времени суток и без часовой пояс или смещение от UTC .

Часовой пояс имеет решающее значение при определении даты. В любой момент времени дата меняется по всему земному шару в зависимости от зоны. Например, через несколько минут после полуночи в Париж Франция - это новый день, но все еще "вчера" в Монреаль Квебек .

Если часовой пояс не указан, JVM неявно применяет свой текущий часовой пояс по умолчанию. Это значение по умолчанию может измениться в любой момент во время выполнения (!), Поэтому ваши результаты могут отличаться. Лучше указать в качестве аргумента ваш желаемый / ожидаемый часовой пояс .

Укажите собственное имя часового пояса в формате continent/region, например America/Montreal, Africa/Casablanca или Pacific/Auckland. Никогда не используйте 2-4 буквенные сокращения, такие как EST или IST, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

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

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

Первый момент дня

с 12:00 до 12:00

День не всегда длится с 12 до 12 утра!

Никогда не предполагайте, когда день начинается или заканчивается. День не всегда длится 24 часа, это может быть 23, 23,5, 25 или любое другое количество часов, придуманное политиками, определяющими часовой пояс. В некоторых зонах в некоторые даты день может не начинаться в 00:00, он может начинаться в другое время, например 01:00. Пусть java.time определит, когда день начинается и заканчивается.

Half-Open

Как правило, лучший подход при определении промежутка времени - это подход Half-Open. В этом подходе начало включительно , а окончание исключительно . Это позволяет избежать проблем, связанных с попыткой точно определить долю секунды в конце дня. День начинается в первый момент одной даты и продолжается, но не включает первый момент следующей даты.

ZonedDateTime zdtStart = ld.atStartOfDay( z ) ;  // First moment of the day as seen in the wall-clock time used by the people of a particular region as defined arbitrarily by their politicians (a time zone).
ZonedDateTime zdtStop = ld.plusDays( 1 ).atStartOfDay( 1 ) ;  // First moment of the day of the *following* date.

Справочная дата эпохи и гранулярность

API Google для DataReadRequest.Builder::setTimeRange учитывает некоторую степень детализации, начиная с некоторой контрольной даты эпохи . К сожалению, ни предел гранулярности, ни ссылка на эпоху не указаны - и существует много ссылок на эпоху .

Я возьму предположение за секунды, являющееся самой тонкой гранулярностью, и предположу, что в 1970-01-01T00: 00Z это ссылка на эпоху. Эта эпоха используется классами java.time и ужасным старым java.util.Date классом.

long secondsSinceEpoch_Start = zdtStart.toEpochSecond() ;
long secondsSinceEpoch_Stop = zdtStop.toEpochSecond() ;

Сделайте звонок в API.

            …
            .setTimeRange( 
                secondsSinceEpoch_Start , 
                secondsSinceEpoch_Stop , 
                TimeUnit.SECONDS
            )
            …

О java.time

Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует выполнить переход на классы java.time .

Чтобы узнать больше, см. Учебное пособие по Oracle . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где оbtain классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздних версий - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 7
    • Большинство функций java.time перенесено в Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии пакетов Android для реализации java.time классы.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .
0 голосов
/ 08 ноября 2018
you can try like this

            Date date1 = new Date();
            SimpleDateFormat  formatter1 = new SimpleDateFormat("MMddyyyy"); 
            String format = formatter1.format(date1);
            SimpleDateFormat  formatter = new SimpleDateFormat("MMddyyyy hh:mm:ss"); 
            Calendar cal = Calendar.getInstance();
            Date today = formatter.parse(format+" 00:00:00");
            cal.setTime(today);
            long start = cal.getTimeInMillis();
            System.out.println("start time:"+start);
            Date date=formatter.parse(format+" 23:59:59");
            cal.setTime(date);
            long end = cal.getTimeInMillis();
            System.out.println("end time: "+end);

            Date tem= new Date();

            cal.setTime(tem);

            long present = cal.getTimeInMillis();

            System.out.println(present);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...