Android: Как я могу получить время в секундах с этого момента до 3 утра понедельника на следующей неделе? - PullRequest
0 голосов
/ 06 октября 2018

В настоящее время я пытаюсь создать в своем приложении для Android firebase JobDispatcher, который начнет работу около 3:00 в понедельник, независимо от того, когда работа будет создана.Я видел примеры использования Joda-Time, класса Period и TemporalAdjusters, но я пытаюсь поддерживать уровни API 16 и выше, поэтому мне нужно что-то, что будет работать с ними.

В настоящее время я создаю новое задание со следующим ограничением (среди прочих) .setTrigger (Trigger.executionWindow (secondsUntilMonday, secondsUntilMonday +dersranceInterval))

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

Пожалуйста, помогите!

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

java.time

    ZoneId here = ZoneId.of("America/Danmarkshavn");
    ZonedDateTime now = ZonedDateTime.now(here);
    ZonedDateTime nextMondayAtThree = now.with(TemporalAdjusters.next(DayOfWeek.MONDAY))
            .with(LocalTime.of(3, 0));
    long secondsUntilMonday = ChronoUnit.SECONDS.between(now, nextMondayAtThree);
    System.out.println(nextMondayAtThree);
    System.out.println("Seconds: " + secondsUntilMonday);

Когда я только что запустил этот фрагмент, вывод был:

2018-10-08T03:00Z[America/Danmarkshavn]
Seconds: 147419

Пожалуйста, замените часовой пояс, так как он, вероятно,не Америка / Danmarkshavn.

Я также предлагаю вам сравнить не только количество строк, но, в частности, удобство чтения с ответом с использованием устаревшего Calendar класса (не поймите меня неправильно: если вы хотите использовать класс Calendar, это будет хорошим ответом; я просто не думаю, что вы захотите использовать класс Calendar при сравнении).

Вопрос: Могу ли я использовать java.time на уровнях API Android 16 и выше?

Да, java.time прекрасно работает на старых и новых устройствах Android.Для этого требуется как минимум Java 6 .

  • В Java 8 и более поздних версиях и на новых устройствах Android (от уровня API 26, как мне сказали), новый API поставляется встроенным.
  • В Java 6 и 7 получите ThreeTen Backport, бэкпорт новых классов (ThreeTen для JSR 310, где впервые был описан современный API).
  • На (более старом) Android, используйте Android-версию ThreeTen Backport.Это называется ThreeTenABP.Убедитесь, что вы импортируете классы даты и времени из пакета org.threeten.bp и подпакетов.

Ссылки

0 голосов
/ 06 октября 2018

Вот способ, который может вам помочь:

@Test
public void computeSecondsToMonday(){
    Calendar c = Calendar.getInstance();
    System.out.print("\r\n" + c.getTime().toString());

    long millisNow = c.getTimeInMillis();

    // let's advance to nex Monday

    int dw = c.get(Calendar.DAY_OF_WEEK);

    // days until monday
    int daysToMonday = 0;
    if(dw >= Calendar.MONDAY){
        daysToMonday = Calendar.SATURDAY - dw + Calendar.MONDAY;
    } else {
        daysToMonday = Calendar.MONDAY - dw;
    }

    // now add days to Monday
    c.add(Calendar.DAY_OF_MONTH, daysToMonday);
    c.set(Calendar.HOUR_OF_DAY, 3);
    c.set(Calendar.MINUTE, 0);
    c.set(Calendar.SECOND, 0);
    // we're in next Monday 3:00 AM
    System.out.print("\r\n" + c.getTime().toString());

    // compute number of millis until Monday
    long millisInMonday = c.getTimeInMillis();
    long millisToMonday = millisInMonday - millisNow;

    // convert millis to sec
    long secondsToMonday = millisToMonday / 1000;

    System.out.print(String.format("\r\nSeconds Until Monday: %d", secondsToMonday));

}

Вот вывод из ExampleUnitTest в Android Studio:

Сб 06 октября 09:41:54 WEST 2018
Пн. Окт. 08 03:00:00 ЗАПАД 2018
Секунды до понедельника: 148686

Просто адаптируйте метод к вашим потребностям, например:

public long computeSecondsToMonday(){
    ···
    return secondsToMonday;
}

Надеюсь, это то, что вам нужно.

...