Java日期时间API系列35-----Jdk8中java.time包中的新的日期时间API类应用,微秒和纳秒等更精确的时间格式化和解析。
通过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类应用,微秒和纳秒等更精确的时间格式化和解析。的更多相关文章
- 在swt中获取jar包中的文件 uri is not hierarchical
uri is not hierarchical 学习了:http://blog.csdn.net/zdsdiablo/article/details/1519719 在swt中获取jar包中的文件: ...
- API接口自动化之3 同一个war包中多个接口做自动化测试
同一个war包中多个接口做自动化测试 一个接口用一个测试类,每个测试用例如下,比如下面是4个测试用例,每个详细的测试用例中含有请求入参,返回体校验,以此来判断每条测试用例是否通过 一个war包中,若含 ...
- Andriod项目开发实战(1)——如何在Eclipse中的一个包下建新包
最开始是想将各个类分门别类地存放在不同的包中,所以想在项目源码包中新建几个不同功能的包eg:utils.model.receiver等,最后的结果应该是下图左边这样的: 很明显建立项目后的架构是上 ...
- 秒(s) 毫秒(ms) 微秒(μs) 纳秒(ns) 皮秒(ps)及Java获得 .
Date date=new Date(); long hm=date.getTime(); //获取毫秒 或者 毫秒级:System.currentTimeMillis() 纳秒级: System.n ...
- Mac 如何导出ipa文件中Assets.car包中的切图
在之前 获取 AppStore 中 应用 的 IPA 包文件(Mac OS 13+)中获取到应用的 IPA 包,可以取出应用的部分图片(如 Logo),如果项目工程中把图片添加到 Assets.xca ...
- 【转】Eclipse中查看jar包中的源码
(简单的方式:通过jd-gui来进行反编译,最简单!,参考我的另一篇博文, 地址:http://www.cnblogs.com/gmq-sh/p/4277991.html) Java Decompil ...
- JDK中的Atomic包中的类及使用
引言 Java从JDK1.5开始提供了java.util.concurrent.atomic包,方便程序员在多线程环境下,无锁的进行原子操作.原子变量的底层使用了处理器提供的原子指令,但是不同的CPU ...
- Package.json中dependencies依赖包中^符号和~符号前缀的区别
刚git了webpack的包发现package.json里面dependencies依赖包的版本号前面的符号有两种,一种是~,一种是^,如下图标记: 然后搜了下在stackoverflow上找到一个比 ...
- goLang 纳秒转 毫秒 转 英文时间格式
package main import ( "fmt" "time" ) func main(){ fmt.Println(time.Now().Unix()) ...
- Java8系列 (六) 新的日期和时间API
概述 在Java8之前, 我们一般都是使用 SimpleDateFormat 来解析和格式化日期时间, 但它是线程不安全的. @Test public void test() { SimpleDate ...
随机推荐
- git篇-- Git在项目实操中常见的使用命令--02
Git是现代软件开发中不可或缺的版本控制工具.它能帮助开发者跟踪项目的所有变更,并与团队成员高效协作.本文将介绍一些在项目实操中常见的Git命令,帮助你更好地管理代码. 1. 初始化和配置 初始化仓库 ...
- VSCode的安装
VSCode(visual studio code),是一款功能强大且易用的编辑器.支持JavaScript.Node.js,也提供其他语言如(C ++,C#,Python,PHP,Go)的扩展插件. ...
- Jmeter函数助手6-time
time函数用于获取不同格式的当前时间(年月日时分秒). Format string for SimpleDateFormat (optional):时间格式,填入如yyyyMMdd-HHmmss.d ...
- python性能分析器:cProfile
代码: (1) import cProfile import re cProfile.run('re.compile("foo|bar")') 运行结果: (2) import c ...
- 控制自行车前进/后退/平衡等动作,有必要使用在控制方面使用人工智能算法吗,还是传统的PID算法就完全可以胜任?
直接说答案,用不到人工智能算法做控制,现在人工智能算法主要的应用领域为感知学习,比较典型的就是图像识别和自然语言对话系统,而在控制算法上人工智能的解决方案依然不是很成熟,目前世界上唯一一个宣布可以落地 ...
- 【转载】 GPU地址空间的相关概念
为了结合上篇 文章 https://www.cnblogs.com/devilmaycry812839668/p/13264080.html 对RTX显卡是否能够实现P2P通信功能,同时专业级别显 ...
- AI未来应用的新领域:具有领域知识的专属智能拼音输入法 —— 医生专属的智能输入法
本人上个月去辽宁中医看了些小毛病,在和医生交流的时候随便小聊一下,其中一个主要的话题就是"医生是否需要练习五笔".众所周知,医生的主要工作是看病,而需要使用输入法打字写病历只是看病 ...
- 讲师招募 | Apache DolphinScheduler Meetup诚邀您共建开源!
随着Apache DolphinScheduler在全球范围内的快速发展,我们的用户群体和社区活动也在不断扩大. 为了进一步丰富我们的社区内容,分享更多有价值的知识和经验,我们诚挚地邀请您加入我们,成 ...
- mysql数据库中decimal数据类型比较大小
在MySQL中,DECIMAL数据类型用于存储精确的数值,它非常适合用于需要高精度计算的场景,如金融应用.当我们需要在MySQL数据库中比较DECIMAL类型数据的大小时,可以使用标准的比较运算符,如 ...
- .NET8 Blazor 从入门到精通:(二)组件
目录 Blazor 组件 基础 路由 参数 组件参数 路由参数 生命周期事件 状态更改 组件事件 Blazor 组件 基础 新建一个项目命名为 MyComponents ,项目模板的交互类型选 Aut ...