我需要获得格式的日期-时间字符串
"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
问题中的代码是否可靠
但我不知道它是否可靠,也就是说,它是否计算该日期瞬间的毫秒数。
不,您的代码不太可靠。两点:
- 如果毫秒小于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,即现代类的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