ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java8 LocalDateTime和NANO_OF_SECOND奇怪的格式化

2019-07-22 07:02:35  阅读:999  来源: 互联网

标签:java datetime java-8 datetime-format 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));

为了获得具有亚秒信息的输出
现在= 2018年4月12日14:47:38.039578300

不幸的是,在每秒的前100毫秒中,亚秒信息的前导零被省略,我得到一个非常误导的输出Now = 12-Apr-2018 14:47:38.39578300,​​这很容易被误解为大约38.4秒,完整秒后396毫秒,而不是真正的38.04秒.

我发现的唯一的工作方式是ss.nnnnnnnnn的格式,正好是9 n,以获得我想要的输出.

编辑:

有一些更好的东西,我在发布这个问题时在这方面错过了.

我对Nanoseconds并不是很感兴趣,但是我真正想要的是秒的一小部分(大约是ms分辨率).

然后,这个更合适

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss.SSS");

大写字母S表示亚秒数字的数量,当然包括前导零.

解决方法:

如果只需要ms分辨率,则可以使用S代替n:

DateTimeFormatter formatter = DateTimeFormatter
    .ofPattern("dd-MMM-yyyy  HH:mm:ss.SSS", Locale.US);

这将只打印前3个小数位(即ms分辨率):

12-Apr-2018 14:47:38.039

请注意,我使用java.util.Locale来定义用于月份名称的语言.这是因为JVM可能并不总是设置为英语,结果可能不是您所期望的.例如:我的JVM设置为葡萄牙语,月份名称为“abr”.设置特定的区域设置可以消除此问题.

要打印所有9位数字,使用nnnnnnnnn或SSSSSSSSS将起作用.

当我们check the javadoc时,我们可以看到为什么它的行为如此.S和n有不同的表现:

Symbol  Meaning                     Presentation      Examples
------  -------                     ------------      -------
S       fraction-of-second          fraction          978
n       nano-of-second              number            987654321

S是分数,而n是数字.文档告诉你区别:

Number: If the count of letters is one, then the value is output using the minimum number of digits and without padding.

Fraction: Outputs the nano-of-second field as a fraction-of-second. The nano-of-second value has nine digits, thus the count of pattern letters is from 1 to 9. If it is less than 9, then the nano-of-second value is truncated, with only the most significant digits being output.

因此,只有1 n将打印没有填充的值(开头没有0),导致你得到错误的输出,而SSS会给你正确的输出.

标签:java,datetime,java-8,datetime-format,java-time
来源: https://codeday.me/bug/20190722/1500373.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有