我目前正在尝试在我的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。