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



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

"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">

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

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

这个答案之所以被接受,是因为它提供了信息。这个建议不适用于我的情况。

事实上,我的应用程序需要与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";

但我不知道它是否可靠,也就是说,它是否正确计算了那个日期瞬间的毫秒数。

java.time和ThreeTennABP

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

简易版:

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

刚才运行时的输出:

2019-11-08T21:43:31.893Z

如果milliseoncds恰好为0(在1000中的一种情况下应为0(,则不会打印它们。请检查这是否会给您带来问题。省略毫秒符合ISO8601标准,所以应该可以,但要检查一下情况。如果你总是需要毫秒,请使用格式化程序:

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

问题中的代码是否可靠

但我不知道它是否可靠,也就是说,它是否计算该日期瞬间的毫秒数。

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

  1. 如果毫秒小于100,则将以少于3位的数字打印。58.012秒将被错误地打印为58.12秒。我同意你的意见,即可以找到解决这个问题的办法
  2. 更糟糕的是,但与毫秒无关:您的代码在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,即现代类的Backport(JSR310的ThreeTen;请参阅底部的链接(
  • 在(旧的(安卓系统上使用安卓版的ThreeTen Backport。它被称为ThreeTenABP。并确保您使用子包从org.threeten.bp导入日期和时间类

链接

  • Oracle教程:日期时间,解释如何使用java.Time
  • Java规范请求(JSR(310,其中首次描述了java.time
  • ThreeTen Backport项目,java.time到Java 6和7的Backport(JSR-310的ThreeTen(
  • ThreeTenABP,安卓版ThreeTen背包
  • 问题:如何在Android项目中使用ThreeTenABP,有一个非常彻底的解释
  • 维基百科文章:ISO 8601

最新更新