通过Java日期时间API系列1-----Jdk7及以前的日期时间类中得知,Java8以前除了java.sql.Timestamp扩充纳秒,其他类最大只精确到毫秒;Java8 time包所有相关类都支持纳秒。下面是示意图:

图中的nano 是 一秒钟包含的纳秒值,0到999999999。毫秒,微秒和纳秒都是通过这个值计算得到的。

1.Timestamp格式化中的纳秒。

java.sql.Timestamp.toString()方法中的格式为:

格式化模板是:yyyy-mm-dd hh:mm:ss.fffffffff,这里的 fffffffff 指的是纳秒,但会将最后的0省略掉。比如:

2020-05-23 17:06:30.0
2020-05-23 17:06:30.272
2020-05-23 17:06:30.27215
2020-05-23 17:06:30.27215062

2.Timestamp格式解析

.

/**
* 解析Timestamp格式字符串为LocalDateTime 默认格式 yyyy-mm-dd hh:mm:ss.fffffffff 其中 fffffffff 纳秒,省略后面的0 比如:
* <pre>
* 2020-05-23 17:06:30.0
* 2020-05-23 17:06:30.272
* 2020-05-23 17:06:30.27215
* 2020-05-23 17:06:30.27215062
*</pre>
* @param text
* @return LocalDateTime
*/
public static LocalDateTime parseTimestampStyleToLocalDateTime(String text){
//预处理
Objects.requireNonNull(text, "text");
text=text.trim();
if(!text.contains(".")){
throw new DateTimeException("text is not supported! " + text);
} //.分割成2部分,分别分析
String[] textArr = text.split("\\.");
String main = textArr[0];
String nanoOfSecond = textArr[1];
int mainLen = main.length();
int len = nanoOfSecond.length();
if(mainLen != DateFormatPattern.YYYY_MM_DD_HH_MM_SS.length()){
throw new DateTimeException("text is not supported! " + text);
}
if(len>9){
throw new DateTimeException("text is not supported! " + text);
} //纳秒部分补0
StringBuilder sb = new StringBuilder();
for(int i=0;i<9-len;i++){
sb.append("0");
}
nanoOfSecond = nanoOfSecond+sb.toString();
text = main+"."+nanoOfSecond; //使用yyyy-MM-dd HH:mm:ss.SSSSSSSSS 标准格式解析
return parseToLocalDateTime(text, DateTimeFormatterUtil.YYYY_MM_DD_HH_MM_SS_SSSSSSSSS_FMT);
}

测试:

  /**
* 含纳秒Timestamp时间格式解析
*/
@Test
public void parseTimestampStyleTest(){ Date date = DateTimeFormatterUtil.smartParseToDate("2020-05-23 17:06:30"); Date date2 = DateTimeFormatterUtil.parseTimestampStyleToDate("2020-05-23 17:06:30.0"); Date date3 = DateTimeFormatterUtil.parseTimestampStyleToDate("2020-05-23 17:06:30.0"); Assert.assertEquals(date, date2);
Assert.assertEquals(date2, date3); LocalDateTime localDateTime1 = DateTimeFormatterUtil.smartParseToLocalDateTime("2020-05-23 17:06:30.272150"); LocalDateTime localDateTime2 = DateTimeFormatterUtil.smartParseToLocalDateTime("2020-05-23 17:06:30.27215");
Assert.assertEquals(localDateTime1, localDateTime2);
}

3.微秒和纳秒的格式化和解析

 // ==================================yyyy-MM-dd HH:mm:ss.SSSSSS 相关Pattern==================================    

    /**
* yyyy-MM-dd HH:mm:ss.SSSSSS 比如:2020-05-23 17:06:30.272150
*/
public static final String YYYY_MM_DD_HH_MM_SS_SSSSSS = "yyyy-MM-dd HH:mm:ss.SSSSSS"; // ==================================yyyy-MM-dd HH:mm:ss.SSSSSSSSS 相关Pattern================================== /**
* yyyy-MM-dd HH:mm:ss.SSSSSSSSS 比如:2020-05-23 17:06:30.272150620
*/
public static final String YYYY_MM_DD_HH_MM_SS_SSSSSSSSS = "yyyy-MM-dd HH:mm:ss.SSSSSSSSS";

(1)格式化

  /**
* 含纳秒时间格式化
*/
@Test
public void formatTimeWithNanoTest(){
LocalDateTime localDateTime = DateTimeFormatterUtil.smartParseToLocalDateTime("2020-05-23T17:06:30.272150620+08:00");
//时间格式化
Assert.assertEquals("17:06:30.272", DateTimeFormatterUtil.format(localDateTime, DateTimeFormatterUtil.HH_MM_SS_SSS_FMT));
Assert.assertEquals("17:06:30.272150", DateTimeFormatterUtil.format(localDateTime, DateTimeFormatterUtil.HH_MM_SS_SSSSSS_FMT));
Assert.assertEquals("17:06:30.272150620", DateTimeFormatterUtil.format(localDateTime, DateTimeFormatterUtil.HH_MM_SS_SSSSSSSSS_FMT)); //日期时间格式化
Assert.assertEquals("2020-05-23 17:06:30.272150", DateTimeFormatterUtil.format(localDateTime, DateTimeFormatterUtil.YYYY_MM_DD_HH_MM_SS_SSSSSS_FMT));
Assert.assertEquals("2020-05-23 17:06:30.272150620", DateTimeFormatterUtil.format(localDateTime, DateTimeFormatterUtil.YYYY_MM_DD_HH_MM_SS_SSSSSSSSS_FMT)); //ISO日期时间格式化
Assert.assertEquals("2020-05-23T17:06:30.272150620+0800", DateTimeFormatterUtil.format(localDateTime, DateTimeFormatterUtil.YYYY_MM_DD_T_HH_MM_SS_SSSSSSSSS_Z_FMT));
Assert.assertEquals("2020-05-23T17:06:30.272150620+08:00", DateTimeFormatterUtil.format(localDateTime, DateTimeFormatterUtil.YYYY_MM_DD_T_HH_MM_SS_SSSSSSSSS_XXX_Z_FMT));
}

(2)解析

 /**
* 含纳秒时间格式解析
*/
@Test
public void parseTimeWithNanoTest(){
LocalDateTime localDateTime1 = DateTimeFormatterUtil.smartParseToLocalDateTime("2020-05-23T17:06:30.272150620+08:00"); LocalDateTime localDateTime2 = DateTimeFormatterUtil.smartParseToLocalDateTime("2020-05-23T17:06:30.272150+08:00"); LocalDateTime localDateTime3 = DateTimeFormatterUtil.smartParseToLocalDateTime("2020-05-23T17:06:30.272+08:00"); Assert.assertTrue(localDateTime3.isBefore(localDateTime2)); Assert.assertTrue(localDateTime2.isBefore(localDateTime1));
}

4.LocalDateTime转Date会精度丢失,丢失毫秒以后部分。

因为Date只精确到毫秒,下面是转换方法:DateTimeConverterUtil类中

    /**
* LocalDateTime转Date
* @param localDateTime
* @return Date
*/
public static Date toDate(LocalDateTime localDateTime) {
Objects.requireNonNull(localDateTime, "localDateTime");
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}
Date from(Instant instant)方法:
    public static Date from(Instant instant) {
try {
return new Date(instant.toEpochMilli());
} catch (ArithmeticException ex) {
throw new IllegalArgumentException(ex);
}
}

核心部分:new Date(instant.toEpochMilli()); 创建Date只使用了Instant的时间戳部分 instant.toEpochMilli()。只到毫秒。

源代码地址:https://github.com/xkzhangsan/xk-time

Java日期时间API系列35-----Jdk8中java.time包中的新的日期时间API类应用,微秒和纳秒等更精确的时间格式化和解析。的更多相关文章

  1. 在swt中获取jar包中的文件 uri is not hierarchical

    uri is not hierarchical 学习了:http://blog.csdn.net/zdsdiablo/article/details/1519719 在swt中获取jar包中的文件: ...

  2. API接口自动化之3 同一个war包中多个接口做自动化测试

    同一个war包中多个接口做自动化测试 一个接口用一个测试类,每个测试用例如下,比如下面是4个测试用例,每个详细的测试用例中含有请求入参,返回体校验,以此来判断每条测试用例是否通过 一个war包中,若含 ...

  3. Andriod项目开发实战(1)——如何在Eclipse中的一个包下建新包

    最开始是想将各个类分门别类地存放在不同的包中,所以想在项目源码包中新建几个不同功能的包eg:utils.model.receiver等,最后的结果应该是下图左边这样的:   很明显建立项目后的架构是上 ...

  4. 秒(s) 毫秒(ms) 微秒(μs) 纳秒(ns) 皮秒(ps)及Java获得 .

    Date date=new Date(); long hm=date.getTime(); //获取毫秒 或者 毫秒级:System.currentTimeMillis() 纳秒级: System.n ...

  5. Mac 如何导出ipa文件中Assets.car包中的切图

    在之前 获取 AppStore 中 应用 的 IPA 包文件(Mac OS 13+)中获取到应用的 IPA 包,可以取出应用的部分图片(如 Logo),如果项目工程中把图片添加到 Assets.xca ...

  6. 【转】Eclipse中查看jar包中的源码

    (简单的方式:通过jd-gui来进行反编译,最简单!,参考我的另一篇博文, 地址:http://www.cnblogs.com/gmq-sh/p/4277991.html) Java Decompil ...

  7. JDK中的Atomic包中的类及使用

    引言 Java从JDK1.5开始提供了java.util.concurrent.atomic包,方便程序员在多线程环境下,无锁的进行原子操作.原子变量的底层使用了处理器提供的原子指令,但是不同的CPU ...

  8. Package.json中dependencies依赖包中^符号和~符号前缀的区别

    刚git了webpack的包发现package.json里面dependencies依赖包的版本号前面的符号有两种,一种是~,一种是^,如下图标记: 然后搜了下在stackoverflow上找到一个比 ...

  9. goLang 纳秒转 毫秒 转 英文时间格式

    package main import ( "fmt" "time" ) func main(){ fmt.Println(time.Now().Unix()) ...

  10. Java8系列 (六) 新的日期和时间API

    概述 在Java8之前, 我们一般都是使用 SimpleDateFormat 来解析和格式化日期时间, 但它是线程不安全的. @Test public void test() { SimpleDate ...

随机推荐

  1. 【SQL】 牛客网SQL训练Part3 较难难度

    获取当前薪水第二多的员工的emp_no以及其对应的薪水salary 请你查找薪水排名第二多的员工编号emp_no.薪水salary.last_name以及first_name,不能使用order by ...

  2. 【Spring】01 快速入门

    Spring快速入门 空Maven项目创建 声明工程名称,完成 删除SRC目录,创建01 HelloSpring模块 导入依赖 Maven坐标: <!-- https://mvnreposito ...

  3. 视觉测距和SLAM —— Visual Odometry / SLAM

    地址: https://www.cvlibs.net/datasets/kitti/eval_odometry.php

  4. 【转载】 Nature再发DeepMind研究:AI复现大脑网格细胞模拟导航!

    原文地址: https://news.eeany.cn/news/416675-19.html ==================================================== ...

  5. Java核心技术之Date相关

    import java.time.DayOfWeek; import java.time.LocalDate; import java.util.Scanner; /** * @author Suns ...

  6. 最短小精悍的js数组打乱顺序

          let number = [1, 45, 13, 17];       // 封装一个打乱数组的方法       function getarr(arr) {         return ...

  7. apollo配置动态更新

    简单配置 使用@Value注解的配置会自动刷新配置 复杂对象 @Component("systemConfig") @ConfigurationProperties(prefix ...

  8. 从0实现基于Linux socket聊天室-实现聊天室的公聊、私聊功能-4

    前面文章链接如下: <从0实现基于Linux socket聊天室-多线程服务器模型-1> <从0实现基于Linux socket聊天室-多线程服务器一个很隐晦的错误-2> &l ...

  9. 手把手教Linux驱动10-platform总线详解

    platform总线是学习linux驱动必须要掌握的一个知识点. 本文参考已发布:Linux 3.14内核 一.概念 嵌入式系统中有很多的物理总线:I2c.SPI.USB.uart.PCIE.APB. ...

  10. 在 Python 中通过读取 .env 文件获得环境变量

    在编写 Python 脚本时,我们会使用一些私密数据,如调用 API 时使用的 token.为了避免隐私泄露,这些私密数据一般不直接写入脚本文件中.而是写入一个文件,并通过读取文件的方式获取私密数据内 ...