Java日期时间API系列35

  通过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(){

1 Date date \= DateTimeFormatterUtil.smartParseToDate("2020-05-23 17:06:30"); 2 3 Date date2 \= DateTimeFormatterUtil.parseTimestampStyleToDate("2020-05-23 17:06:30.0"); 4 5 Date date3 \= DateTimeFormatterUtil.parseTimestampStyleToDate("2020-05-23 17:06:30.0"); 6 7 Assert.assertEquals(date, date2); 8 Assert.assertEquals(date2, date3); 9 10 LocalDateTime localDateTime1 \= DateTimeFormatterUtil.smartParseToLocalDateTime("2020-05-23 17:06:30.272150"); 11 12 LocalDateTime localDateTime2 \= DateTimeFormatterUtil.smartParseToLocalDateTime("2020-05-23 17:06:30.27215"); 13 Assert.assertEquals(localDateTime1, localDateTime2); 14}

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

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

1/\*\* \* yyyy-MM-dd HH:mm:ss.SSSSSS 比如:2020-05-23 17:06:30.272150 \*/ 2public 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================================== 3 4/\*\* \* yyyy-MM-dd HH:mm:ss.SSSSSSSSS 比如:2020-05-23 17:06:30.272150620 \*/ 5public 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");

1 LocalDateTime localDateTime2 \= DateTimeFormatterUtil.smartParseToLocalDateTime("2020-05-23T17:06:30.272150+08:00"); 2 3 LocalDateTime localDateTime3 \= DateTimeFormatterUtil.smartParseToLocalDateTime("2020-05-23T17:06:30.272+08:00"); 4 5 Assert.assertTrue(localDateTime3.isBefore(localDateTime2)); 6 7 Assert.assertTrue(localDateTime2.isBefore(localDateTime1)); 8}

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

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

1/\*\* \* LocalDateTime转Date 2 \* @param localDateTime 3 \* @return Date \*/ 4public static Date toDate(LocalDateTime localDateTime) { 5 Objects.requireNonNull(localDateTime, "localDateTime"); return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); 6}

Date from(Instant instant)方法:

1public static Date from(Instant instant) { try { return new Date(instant.toEpochMilli()); 2 } catch (ArithmeticException ex) { throw new IllegalArgumentException(ex); 3 } 4}

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

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

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

一篇文章带你了解JavaScript日期

日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用

Java日期时间API系列31

  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前

Python之time模块的时间戳、时间字符串格式化与转换

Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y