ISO 8601时间戳 - 最后6位数字为yyyy-MM-dd'T'HH:mm:ss.?

10

我有类似于这样的时间戳:

    2015-03-21T11:08:14.859831
    2015-03-21T11:07:22.956087

我阅读了ISO 8601维基百科文章,但是没有理解这里的最后6位数字的含义。
我尝试使用"yyyy-MM-dd'T'HH:mm:ss.sss""yyyy-MM-dd'T'HH:mm:ss.ssssss"将其转换为毫秒。它只是比毫秒更精确吗 - 高达微秒?

3
你是想获取毫秒数还是这个问题是关于“这些数字是什么”的? - mambax
在MySQL 5.7查询日志中看到这些内容:"2018-02-02T15:39:15.125927Z"。通过Perl库Time::Moment解析,效果不错。 - David Tonhofer
2个回答

18

它只是比毫秒更精确吗?

是的,在这种情况下它是微秒。

ISO-8601实际上并没有指定最大精度。它声明:

如果有必要,可以包括小时、分钟或秒的小数部分以用于特定应用程序。如果包括小数部分,则应省略较低时间元素(如果有)并通过ISO 31-0中指定的十进制符号,即逗号[,]或句点[.]将小数部分与整数部分分开。逗号是首选符号。如果数字的大小小于单位,则小数符号前应有两个零,依照3.6规定。

根据应用程序的需要,交换方必须同意小数部分的数字位数。[...]

(在我的经验中,你很少看到逗号作为小数分隔符。)

不幸的是,在Java 7中解析这样的值很棘手——没有“仅消耗小数位并执行正确操作”的格式说明符。你可能会发现你需要手动切掉末尾的3个数字,然后再解析为毫秒。

由于Java 8支持纳秒级精度,它相对简单——事实上,内置的ISO格式化程序可以很好地解析它:

import java.time.*;
import java.time.format.*;

public class Test {
    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME;
        System.out.println(LocalDateTime.parse("2015-03-21T11:07:22.956087", formatter));
        
    }
}

1

您不需要DateTimeFormatter

java.time API基于ISO 8601,因此您不需要DateTimeFormatter来解析已经处于ISO 8601格式的日期时间字符串(例如,您的日期时间字符串2015-03-21T11:08:14.859831)。

演示

import java.time.LocalDateTime;

class Main {
    public static void main(String args[]) {
        String strDateTime = "2015-03-21T11:08:14.859831";
        LocalDateTime ldt = LocalDateTime.parse(strDateTime);
        System.out.println(ldt);
    }
}

输出:

2015-03-21T11:08:14.859831

我读了一篇关于ISO 8601的维基百科文章,但是没有理解这里的最后6位数字的含义。
它是秒的一部分,以微秒为分辨率。
我尝试使用“yyyy-MM-dd'T'HH:mm:ss.sss”或“yyyy-MM-dd'T'HH:mm:ss.ssssss”将其降至毫秒级别。
您的模式不正确。毫秒级别的正确字母是S(大写S),即如果您想要值达到毫秒级别,则模式应为“yyyy-MM-dd'T'HH:mm:ss.SSS”。请查看DateTimeFormatter文档以了解更多信息。
它比毫秒更精确吗 - 高达微秒?
是的,它是。java.time API可以提供更精确的分辨率,高达纳秒(取决于系统时钟)。

Trail: Date Time了解更多关于现代日期时间 API 的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接