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



我目前正在尝试在我的安卓应用程序中创建一个Firebase JobDispatcher,它将在星期一凌晨3点左右开始工作,无论工作何时创建。我已经看到了使用 Joda-Time、Period 类和 TemporalAdjusters 的示例,但我正在尝试支持 API 级别 16 及更高版本,所以我需要一些可以与这些级别一起使用的东西。

目前,我正在构建具有以下约束的新工作(除其他外( .setTrigger(Trigger.executionWindow(secondsUntilMonday, 秒直到星期一 + 公差间隔((

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

请帮忙!

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

@Test
public void computeSecondsToMonday(){
Calendar c = Calendar.getInstance();
System.out.print("rn" + 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("rn" + 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("rnSeconds Until Monday: %d", secondsToMonday));
}

以下是 Android Studio 中 ExampleUnitTest 的输出:

周六 10月 06 09:41:54 西部 2018 周一 10月 08 03:00:00 西部 2018

秒 直到星期一: 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

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

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

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

是的,java.time在较旧和较新的Android设备上运行良好。它只需要至少Java6

  • 在Java 8及更高版本以及新的Android设备上(从API级别26开始,我被告知(,新的API是内置的。
  • 在Java 6和7中获取ThreeTen Backport,这是新类的反向移植(JSR 310的ThreeTen,其中首次描述了现代API(。
  • 在(较旧的(Android上,使用Android版本的ThreeTen Backport。它被称为ThreeTenABP。确保从包org.threeten.bp和子包导入日期和时间类。

链接

  • Oracle 教程:日期时间,介绍如何使用java.time
  • 三十向后移植项目
  • ThreeTenABP,ThreeTen Backport 的安卓版
  • 问:如何在Android项目中使用ThreeTenABP,并进行了非常详尽的解释。
  • Java 规范请求 (JSR( 310。

相关内容

  • 没有找到相关文章

最新更新