Android: 我怎样才能得到从现在到下周一凌晨 3 点的时间(以秒为单位)?

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

我目前正在尝试在我的 android 应用程序中创建一个 firebase JobDispatcher,它将在周一凌晨 3 点左右开始工作,无论何时创建工作。我看过使用 Joda-Time、Period class 和 TemporalAdjusters 的示例,但我正在尝试支持 API 级别 16 及更高级别,因此我需要一些可以与它们一起使用的东西。

目前我正在构建一个具有以下约束(以及其他)的新工作 .setTrigger(Trigger.executionWindow(secondsUntilMonday, secondsUntilMonday + toleranceInterval))

但我似乎找不到任何示例来说明如何将我的 secondsUntilMonday 设置为调用该方法与下一次星期一凌晨 3 点左右之间的秒数。

请帮忙!

这里有一个方法可以帮助你:

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

}

这是 Android Studio 中 ExampleUnitTest 的输出:

Sat Oct 06 09:41:54 WEST 2018
Mon Oct 08 03:00:00 WEST 2018
Seconds Until Monday: 148686

只需根据您的需要调整方法,例如:

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

希望这是你需要的。

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

请替换您的时区,因为它可能不是 America/Danmarkshavn。

我还邀请您不仅要比较行数,还要比较 的易读性(不要误解我:如果您想使用 Calendar class,那将是一个很好的答案;我只是认为您在比较时不会想使用 Calendar class。

问题:我可以在 Android API 16 级及以上使用 java.time 吗?

是的,java.time 在新旧 Android 设备上都能很好地工作。它只需要至少 Java 6.

  • 在 Java 8 和更高版本以及新的 Android 设备上(据我所知,来自 API 级别 26)新的 API 是内置的。
  • 在 Java 6 和 7 中获取 ThreeTen Backport,新 classes 的 backport(ThreeTen 用于 JSR 310,其中首次描述了现代 API)。
  • 在(较旧的)Android 上,使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。确保从包 org.threeten.bp 和子包中导入日期和时间 classes。

链接