从 Android API 级别 19 上的 date.getTime() 获取毫秒数

Posted

技术标签:

【中文标题】从 Android API 级别 19 上的 date.getTime() 获取毫秒数【英文标题】:Getting milliseconds from date.getTime() on Android API level 19 【发布时间】:2019-11-08 15:40:15 【问题描述】:

我需要获取格式的日期时间字符串

"yyyy-MM-dd'T'HH:mm:ss.SSSZ"

其中 SSS 是毫秒数(从 000 到 999)。

我写了如下代码sn-p:

Date date=Calendar.getInstance().getTime();
String currentDateTimeString = (String) android.text.format.DateFormat.
       format("yyyy-MM-dd'T'HH:mm:ss.SSSZ",Calendar.getInstance().getTime());

但我得到类似的字符串

“2019-11-08T13:39:33.SSSZ”

由于此答案中描述的一些问题

https://***.com/a/58768066/930835

由于它提供的信息,该答案已被接受。该建议不适用于我的情况。

确实,我的应用需要与 Android API 级别 19 兼容。

顺便说一句,这个问题要求对特定代码 sn-p 进行评估。

这是一个独立的代码 sn-p。所以这是一个不同的问题,它本身很有用。

所以我尝试了这段代码

Date date=Calendar.getInstance().getTime();
    String currentDateTimeString = (String) android.text.format.DateFormat.
           format("yyyy-MM-dd'T'HH:mm:ss",date);
    long ms=date.getTime() %1000;
    currentDateTimeString=currentDateTimeString+"."+String.valueOf(ms)+"Z";

但我不知道它是否可靠,即它是否正确计算了那个 Date 瞬间的毫秒数。

【问题讨论】:

Milliseconds not appearing in DateFormat.format output的可能重复 @locus2k 不,它是关于一个特定的代码 sn-p,它具有不同的计算毫秒数的方法。此外,其他问题的建议需要比我想要的更新的 API 级别。 @Sotirios Delimanolis 查看对问题和上述评论的修改。 【参考方案1】:

java.time 和 ThreeTenABP

对于 Android API 级别 19,我建议您通过反向端口 ThreeTenABP 使用 java.time。

简易版:

    String currentDateTimeString = Instant.now().toString();
    System.out.println(currentDateTimeString);

刚刚运行时的输出:

2019-11-08T21:43:31.893Z

如果 milliseoncds 恰好为 0(预计在 1000 种情况下只有一种),但它们不会被打印。请检查这是否会给您带来问题。省略毫秒符合 ISO 8601 标准,所以应该没问题,但请检查以防万一。如果您确实需要毫秒,请使用格式化程序:

    DateTimeFormatter formatter
            = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSX");
    String currentDateTimeString
            = OffsetDateTime.now(ZoneOffset.UTC).format(formatter);

2019-11-08T21:48:10.262Z

问题中的代码可靠吗?

但我不知道它是否可靠,即它是否计算出 该日期瞬间的毫秒数正确。

不,您的代码不太可靠。两点:

    如果毫秒小于 100,它们将被打印为少于 3 位数字。 58.012 秒会被错误地打印为 58.12 秒。我同意您的评论,即可以找到解决此问题的方法。 更糟糕,但与毫秒无关:您的代码在 JVM 的默认时区(可能是设备时区设置)中打印日期和时间,但附加了Z,从而声称时间是 UTC ,但事实并非如此(除非此特定设备设置为 UTC,但即使设置为 UTC,您也不应始终依赖这种情况)。我不知道android.text.format.DateFormat 是否能提供任何解决此问题的方法。

问题:java.time 不需要 Android API 26 级吗?

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

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

链接

Oracle tutorial: Date Time 解释如何使用 java.time。 Java Specification Request (JSR) 310,其中首次描述了 java.time。 ThreeTen Backport project,java.time 的向后移植到 Java 6 和 7(JSR-310 的 ThreeTen)。 ThreeTenABP,Android 版 ThreeTen Backport Question: How to use ThreeTenABP in Android Project,解释得很透彻。 Wikipedia article: ISO 8601

【讨论】:

对不起,我认为毫秒数问题可以解决。然而,这是有风险的,现在由我来决定。我想了解如何使用 UTC 时间,并使用我的代码。你能在评论中解释一下吗? @P5music 我做了一个小修改,恐怕我不能对评论中的问题做出太多贡献。

以上是关于从 Android API 级别 19 上的 date.getTime() 获取毫秒数的主要内容,如果未能解决你的问题,请参考以下文章

应用程序无法部署到 API 19(平台 4.4.2)上的 Android 英特尔模拟器

Android API 级别 23 上的相机 1 包

Visual Studio:Android SDK 设置(API 级别 19 和 21、22、23)

如何让信任锚在 Android API 级别 16-19 上正常工作

以离子形式生成API级别19的Apk

Android 上的 Kotlin - 是不是有最低 API 级别要求?