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

Getting milliseconds from date.getTime() on Android API level 19

我需要获取格式为

的日期时间字符串
"yyyy-MM-dd'T'HH:mm:ss.SSSZ"

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

我写了下面的代码片段:

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"

因为这个答案中描述的一些问题

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

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

顺便说一句,这个问题要求评估一个特定的代码片段。

这是一个独立的代码片段。所以这是一个不同的问题,本身就很有用。

所以我尝试了这个代码

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 瞬间的毫秒数。

java.time 和 ThreeTenABP

对于Android API level 19 我建议你使用 java.time 通过backport, ThreeTenABP.

简易版:

    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

题中的代码靠谱吗?

but I do not know if it is reliable, that is, if it calculates the milliseconds of that Date instant correctly.

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

  1. 如果毫秒数小于100,将以少于3位打印。 58.012 秒将被错误地打印为 58.12 秒。我同意您的意见,即可以找到解决此问题的方法。
  2. 更糟,但与毫秒无关:您的代码在 JVM 的默认时区(可能是设备时区设置)中打印日期和时间,但附加 Z,从而声称时间是 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,现代 类 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 类。

链接