我有类似于这样的时间戳:
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"
将其转换为毫秒。它只是比毫秒更精确吗 - 高达微秒?我有类似于这样的时间戳:
2015-03-21T11:08:14.859831
2015-03-21T11:07:22.956087
"yyyy-MM-dd'T'HH:mm:ss.sss"
或"yyyy-MM-dd'T'HH:mm:ss.ssssss"
将其转换为毫秒。它只是比毫秒更精确吗 - 高达微秒?它只是比毫秒更精确吗?
是的,在这种情况下它是微秒。
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));
}
}
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
从Trail: Date Time了解更多关于现代日期时间 API 的内容。