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

问题描述 投票:-1回答:2

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

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

java android datetime milliseconds integer-division
2个回答
1
投票

java.time和ThreeTenABP

对于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

问题中的代码是否可靠?

但是我不知道它是否可靠,也就是说,它是否可以计算出该日期的毫秒数可以立即正确显示。

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

  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(JSR 310的ThreeTen;请参见底部的链接。
  • 在(较旧的)Android上,请使用Android版的ThreeTen Backport。叫做ThreeTenABP。并确保使用子包从org.threeten.bp导入日期和时间类。

链接


0
投票

此作品:

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的代码。

© www.soinside.com 2019 - 2024. All rights reserved.