dat*_*ler 3 java datetime datetime-format java-8 java-time
我尝试以下代码:
import java.time.*;
...
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
"dd-MMM-yyyy HH:mm:ss.n");
System.out.format("Now = %s %n", now.format(formatter));
Run Code Online (Sandbox Code Playgroud)
为了获得具有亚秒级信息的输出
Now = 12-Apr-2018 14:47:38.039578300
不幸的是,在每秒的前100毫秒中,亚秒信息的前导零被忽略了,并且我得到了非常误导的输出Now = 12-Apr-2018 14:47:38.39578300,很容易将其误解为大约38.4秒,即整秒后的396毫秒,而不是真实的。 38.04秒
我发现的唯一工作方法是ss.nnnnnnnnn正好为9 的格式n,以得到所需的输出。
编辑:
有一个更好的东西,我在发布此问题时错过了。
我对纳秒并不真正感兴趣,但是我真正想要的只是几分之一秒(大约毫秒分辨率)。
然后,这个更合适
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss.SSS");
Run Code Online (Sandbox Code Playgroud)
大写字母S表示亚秒数的位数,当然包括前导零。
小智 5
如果您只需要 ms 分辨率,则可以使用S代替n:
DateTimeFormatter formatter = DateTimeFormatter
.ofPattern("dd-MMM-yyyy HH:mm:ss.SSS", Locale.US);
Run Code Online (Sandbox Code Playgroud)
这将只打印前 3 个小数位(这是 ms 分辨率):
2018 年 4 月 12 日 14:47:38.039
请注意,我使用 ajava.util.Locale来定义用于月份名称的语言。那是因为 JVM 可能并不总是设置为英语,结果可能不是您所期望的。例如:我的 JVM 设置为葡萄牙语,月份名称为“abr”。设置特定的语言环境可以消除这个问题。
要打印所有 9 位数字,使用nnnnnnnnn或SSSSSSSSS都可以。
当我们检查 javadoc时,我们可以看到它为什么会这样。S并n有不同的介绍:
Symbol Meaning Presentation Examples
------ ------- ------------ -------
S fraction-of-second fraction 978
n nano-of-second number 987654321
Run Code Online (Sandbox Code Playgroud)
S是一个分数,而n是一个数字。文档告诉你区别:
数字:如果字母数为1,则使用最少的数字位数输出该值,并且不进行填充。
Fraction:输出纳秒字段作为秒的分数。纳秒值有九位数字,因此模式字母的计数是从 1 到 9。如果它小于 9,那么纳秒值将被截断,只输出最重要的数字。
所以,只有 1n将打印没有填充的值(没有0开头),导致你得到错误的输出,而SSS会给你正确的输出。
为了更好地控制分数,您可以使用构建器,而不仅仅是模式字母。特别是appendFraction。
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("dd-MMM-yyyy HH:mm:ss")
.appendFraction(ChronoField.NANO_OF_SECOND, 1, 9, true)
.toFormatter();
Run Code Online (Sandbox Code Playgroud)
模式字母“ n”很少是您想要的。
| 归档时间: |
|
| 查看次数: |
212 次 |
| 最近记录: |