1

我有一个配置为 IST 时区的服务器,它是 GMT+5:30,并且每天都会使用 Cron 作业生成新的 JSON 文件。生成的文件名将为 1551139200000.json 即 GMT:2019 年 2 月 26 日,星期二 12:00:00 AM。

如何仅在上午 12:00 或之后将此文件提供给 Android 应用程序。目前,它可用于所有未达到 12:00 AM 的时区。在这种情况下,它应该访问前一天的 Json 文件。

// normal code here.
long fullMsecs = System.currentTimeMillis();
long ist_offset = 330*60*1000;

long filename = (fullMsecs + ist_offset)/86400_000 * 86400_000;
Log.d(TAG, "onCreate:filename" + filename);

// filename would be affixed with required file extension.

PS:这个逻辑可以在著名的填字游戏中找到,比如拼图 Bonza。在该游戏中,新的谜题将在一天的开始即 12:00 AM 访问。

4

1 回答 1

2

java.time 和 ThreeTenABP

    // Today in user’s time zone
    LocalDate today = LocalDate.now(ZoneId.systemDefault());

    // Today’s file name is epoch millis for 12 AM GMT
    long startOfDayGmt = today.atStartOfDay(ZoneOffset.UTC)
            .toInstant()
            .toEpochMilli();
    String fileName = String.valueOf(startOfDayGmt) + ".json";

    System.out.println("File name: " + fileName);

刚才运行时的输出是你所期望的:

文件名:1551139200000.json

不要像您的问题那样手动进行日期和时间计算。它比您想象的要难,容易出错并且难以阅读和维护。java.time 是现代 Java 日期和时间 API,为您的需要提供了非常好的工具。

问:我可以将 java.time 与 Android minSdkVersion 19 一起使用吗?

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

  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 开始)中,现代 API 是内置的。
  • 在 Java 6 和 7 中获得 ThreeTen Backport,现代类的后向端口(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从org.threeten.bp子包中导入日期和时间类。

链接

于 2019-02-26T17:39:08.443 回答