从 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 英特尔模拟器
Visual Studio:Android SDK 设置(API 级别 19 和 21、22、23)