我目前正在尝试在我的Android应用程序中创建一个Firebase JobDispatcher,它将在星期一的凌晨3点左右开始一个作业,而不管该作业是何时创建的。我已经看到了使用Joda-Time,Period类和TemporalAdjusters的示例,但是我正在尝试支持16级及以上的API,因此我需要一些适用于这些级别的东西。

目前,我正在建立具有以下限制的新工作(除其他外)
.setTrigger(Trigger.executionWindow(secondsUntilMonday,
                        secondsUntilMonday + toleranceInterval))

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

请帮忙!

最佳答案

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



请替换您的时区,因为它可能不在美国/丹麦。

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

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

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


在Java 8和更高版本中以及在新的Android设备上(有人告诉我API级别为26),新的API都是内置的。
在Java 6和7中,获取ThreeTen Backport,即新类的backport(JSR 310的ThreeTen,首次描述了现代API)。
在(较旧的)Android上,使用Android版本的ThreeTen Backport。称为ThreeTenABP。确保从包org.threeten.bp和子包中导入日期和时间类。


链接


Oracle tutorial: Date Time,说明如何使用java.time
ThreeTen Backport project
ThreeTenABP,ThreeTen Backport的Android版
Question: How to use ThreeTenABP in Android Project,其中有非常详尽的说明。
Java Specification Request (JSR) 310

10-02 04:18