旧的和过时的
SimpleDateFormat
类不能这样做。它的替代品,现代的
DateTimeFormatter
,可以。
DateTimeFormatter epochMilliFormatter = new DateTimeFormatterBuilder()
.appendValue(ChronoField.INSTANT_SECONDS)
.appendValue(ChronoField.MILLI_OF_SECOND, 3)
.toFormatter();
Instant sampleInstant = OffsetDateTime
.of(2020, 1, 11, 10, 21, 40, 0, ZoneOffset.UTC)
.toInstant();
String formattedValue = epochMilliFormatter.format(sampleInstant);
System.out.println(formattedValue);
此代码段的输出是您提到的数字:
1578738100万
使用
ChronoField.INSTANT_SECONDS
在格式化程序中
秒
从那个时代开始。我们想要
毫秒
,所以我们需要附加
ChronoField.MILLI_OF_SECOND
立即并确保它们准确打印在3个位置,零填充。这就是
3
作为第二个论点
appendValue()
做。
有没有可能
格式字符串
产生一个字符串
毫秒?
不,使用格式模式字符串是不可能的,使用
日期格式
也没有
日期时间格式
. 你可以检查每一个可能的模式字母,并看到没有模式字母,无论是秒还是毫秒,从纪元。
不过,你确定你想要吗?
即使这是为了存储或用于系统之间的数据交换,通常也不建议在epoch之后使用milliseoncds,因为它们不是人类可读的,因此在调试和特殊查询中很麻烦。在大多数情况下,最好使用ISO 8601格式的字符串,比如
2020-01-11T10:21:40Z
. 详见巴兹尔·布尔克的另一个答案。国际标准化组织8601格式被设计成可供人类和计算机阅读的格式。
无论如何,您不应该使用SimpleDateFormat
这个
日期格式
类是出了名的麻烦(尽管解析比格式化更麻烦)。它也早已过时。这个
Date
你提到的类设计得很差,而且很早就过时了。我建议您使用java.time,即现代的java日期和时间API,正如我上面所做的那样。
链接