我需要获取格式的日期时间字符串
"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";
但是我不知道它是否可靠,也就是说,它是否正确计算出该Date瞬间的毫秒数。
对于Android API级别19,我建议您通过backport ThreeTenABP使用java.time。
简易版:
String currentDateTimeString = Instant.now().toString();
System.out.println(currentDateTimeString);
刚刚运行时的输出:
2019-11-08T21:43:31.893Z
但是,如果千分之一碰巧是0(在一种情况下,预计是千分之一),则不会打印出来。请检查这是否对您有问题。减去毫秒符合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
但是我不知道它是否可靠,也就是说,它是否可以计算出该日期的毫秒数可以立即正确显示。
不,您的代码不太可靠。两点:
Z
,从而声称该时间采用UTC,并非如此(除非该特定设备设置为UTC,但即使已设置为UTC,也不应始终依赖这种情况)。我对android.text.format.DateFormat
不够了解,无法确定它是否可以解决此问题。java.time在较新和较旧的Android设备上均可正常运行。它只需要至少Java 6。
org.threeten.bp
导入日期和时间类。java.time
。java.time
的向后移植到Java 6和7(JSR-310的ThreeTen)。此作品:
Date date=Calendar.getInstance().getTime();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
String currentDateTimeString=dateFormat.format(date);
请注意,必须将Z转义为'Z'。如果没有,您将得到类似yyyy-MM-dd'T'HH:mm:ss.SSS + 0000
因此使用毫秒值是不可靠的,因为数字只能是两个或一个。
例如:99毫秒没有写为099。因此,应考虑到该问题。因此,正确的代码就是此答案中提供的带有SimpleDateFormat的代码。