Search code examples
javaandroidfirebasetimefirebase-job-dispatcher

Android: How can I get the time in seconds from now until 3AM Monday next week?


I'm currently trying to create a firebase JobDispatcher within my android app that will start a job around 3am on a monday, regardless of when the job is created. I have seen examples of using Joda-Time, the Period class and TemporalAdjusters, but I am trying to support API levels 16 and up, so I need something that will work with those.

Currently I am building a new job with the following constraint (among others) .setTrigger(Trigger.executionWindow(secondsUntilMonday, secondsUntilMonday + toleranceInterval))

But I can't seem to find any examples of how to set my secondsUntilMonday to the number of seconds between when the method is called and around the next time 3am on a Monday rolls around.

Please help!


Solution

  • 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);
    

    When I ran this snippet just now, the output was:

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

    Please substitute your time zone since it probably isn’t America/Danmarkshavn.

    I also invite you to compare not just the number of lines, but in particular the ease of reading with the answer using the outdated Calendar class (don’t misunderstand me: if you wanted to use the Calendar class, that would be a good answer; I just don’t think you will want to use the Calendar class when you compare).

    Question: Can I use java.time on Android API levels 16 and up?

    Yes, java.time works nicely on older and newer Android devices. It just requires at least Java 6.

    • In Java 8 and later and on new Android devices (from API level 26, I’m told) the new API comes built-in.
    • In Java 6 and 7 get the ThreeTen Backport, the backport of the new classes (ThreeTen for JSR 310, where the modern API was first described).
    • On (older) Android, use the Android edition of ThreeTen Backport. It’s called ThreeTenABP. Make sure you import the date and time classes from package org.threeten.bp and subpackages.

    Links