Java8 LocalDateTime和NANO_OF_SECOND奇怪的格式

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 位数字,使用nnnnnnnnnSSSSSSSSS都可以。


当我们检查 javadoc时,我们可以看到它为什么会这样。Sn有不同的介绍:

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会给你正确的输出。


Jod*_*hen 5

为了更好地控制分数,您可以使用构建器,而不仅仅是模式字母。特别是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”很少是您想要的。