如何在相应于他们的时区的午夜准确地将文件提供给Android应用程序

问题描述 投票:1回答:1

我有一个配置为时区IST的服务器,格林威治标准时间+5:30,并且每天使用Cron作业生成新的JSON文件。生成的文件名为1551139200000.json ie.GMT:2019年2月26日星期二12:00:00 AM。

如何在12:00 AM之前/之后将此文件提供给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:这个逻辑可以在着名的填字游戏中使用,例如Puzzle Bonza。在那个游戏中,新的谜题将在每天开始时访问,即上午12:00。

android timezone utc current-time
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,为您提供所需的非常好的设施。

问题:我可以在Android minSdkVersion 19中使用java.time吗?

是的,java.time适用于较旧和较新的Android设备。它至少需要Java 6。

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

链接

© www.soinside.com 2019 - 2024. All rights reserved.