写点什么

开源一夏 | Java 格式化日期 微秒

  • 2022 年 8 月 05 日
  • 本文字数:2632 字

    阅读完需:约 9 分钟

开源一夏 | Java格式化日期 微秒

Date、LocalDateTime 格式化微秒值

通常情况下,能用到的时间一般到秒就够用了,比如说创建时间,更新时间之类的,比如这样的日期工具类格式化日期方法

/**	 * 根据传入的时间日期格式化	 *	 * @param dateFormat yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss	 * @return 格式化后的日期时间	 */public static SimpleDateFormat getDateFormat(String dateFormat) {  return new SimpleDateFormat(dateFormat);}
/** * 根据传入的时间日期格式,转换时间字符串 * * @param inStr 时间字符串 * @param dateFormat 日期格式 yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss * @return Date */public static Date stringToDate(String inStr, String dateFormat) { try { return DateUtils.getDateFormat(dateFormat).parse(inStr); } catch (ParseException e) { e.printStackTrace(); } return null;}
复制代码

但是有时候,有一些场景需要日期到微妙,这样的话通常使用的格式化日期的工具类方法会导致精度丢失,那么下面写一个测试类来验证一下,java 测试类代码 TestTime.java 如下

package com.dongao.test;
import com.dongao.project.common.util.DateUtils;
import java.text.ParseException;import java.text.SimpleDateFormat;import java.time.Instant;import java.time.LocalDate;import java.time.LocalDateTime;import java.time.ZoneId;import java.time.format.DateTimeFormatter;import java.util.Date;
public class TestTime {
public static void main(String[] args) { String str = "2022-07-04 23:57:29.696"; Date date = stringToDate(str, "yyyy-MM-dd HH:mm:ss.SSS"); System.out.println("date:["+date+"]"); LocalDateTime datetime = stringToDateTime(str, "yyyy-MM-dd HH:mm:ss.SSS"); System.out.println("datetime:["+datetime+"]"); }
public static Date stringToDate(String inStr, String dateFormat) { try { return getDateFormat(dateFormat).parse(inStr); } catch (ParseException e) { e.printStackTrace(); } return null; }
public static LocalDateTime stringToDateTime(String inStr, String dateFormat) { try { LocalDateTime localDateTime = LocalDateTime.parse(inStr, getDateTimeFormat(dateFormat)); return localDateTime; } catch (Exception e) { e.printStackTrace(); } return null; } public static SimpleDateFormat getDateFormat(String dateFormat) { return new SimpleDateFormat(dateFormat); }
public static DateTimeFormatter getDateTimeFormat(String dateFormat) { return DateTimeFormatter.ofPattern(dateFormat); }}
复制代码

测试类 main 函数执行结果

通过执行结果可以看到用 SimpleDateFormat 对含有微秒值的时间格式在字符串转 Date 时除了会出现精度丢失的情况(精度丢失的情况一般在不是当天最后一个小时时出现),部分时间还会出现转换错误的情况(当天最后几分钟时,会出现上图的转换错误的情况),而用 DateTimeFormatter 对含有微妙值的时间格式字符串转 LocalDateTime 则一切正常。

所以说一般业务不会用到时间格式的毫秒或者说微秒值,如果真的用到的话建议用 LocalDateTime 存储,Mysql 需要用 datetime(6)这样就可以保存微秒值的时间,如图

Date、LocalDateTime 互转

在不考虑微秒或者毫秒时间精度丢失的情况下,Date、LocalDateTime 可以相互转,main 函数增加代码

Date toDate = toDate(datetime);System.out.println("toDate:["+toDate+"]");LocalDateTime toLocalDateTime = toLocalDateTime(date);System.out.println("toLocalDateTime:["+toLocalDateTime+"]");LocalDate toLocalDate = toLocalDate(date);System.out.println("toLocalDate:["+toLocalDate+"]");
复制代码

整个测试类增加方法

public static Date toDate(LocalDateTime localDateTime) {  Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();  return Date.from(instant);}
public static LocalDateTime toLocalDateTime(Date date) { Instant instant = date.toInstant(); LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); return localDateTime;}
public static LocalDate toLocalDate(Date date) { Instant instant = date.toInstant(); LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); LocalDate localDate = localDateTime.toLocalDate(); return localDate;}
复制代码

转换之后结果如图

这里可以看到 Date、LocalDateTime、LocalDate 相互转换的结果,这里再说一下 java8 新时间类的使用场景

LocalDate

{@code LocalDate} is an immutable date-time object that represents a date,often viewed as year-month-day. Other date fields, such as day-of-year,day-of-week and week-of-year, can also be accessed.
复制代码

{@code LocalDate}是一个不可变的日期时间对象,表示日期,通常被视为年-月-日。还可以访问其他日期字段,如年月日、星期日和一年中的星期。

LocalDateTime

{@code LocalDateTime} is an immutable date-time object that represents a date-time,often viewed as year-month-day-hour-minute-second. Other date and time fields,such as day-of-year, day-of-week and week-of-year, can also be accessed.Time is represented to nanosecond precision.
复制代码

{@code LocalDateTime}是一个不可变的日期时间对象,表示日期时间,通常被视为年-月-日-小时-分-秒。还可以访问其他日期和时间字段,如一年中的某一天、某一周和某一年的某一周。时间以纳秒精度表示。

LocalTime

{@code LocalTime} is an immutable date-time object that represents a time,often viewed as hour-minute-second.Time is represented to nanosecond precision.
复制代码

{@code LocalTime}是一个不可变的日期-时间对象,表示时间,通常被视为小时-分钟-秒。时间以纳秒精度表示。

最后再补充一下 java8 api 文档地址 (https://www.matools.com/api/java8),方便大家查阅哈

发布于: 刚刚阅读数: 8
用户头像

还未添加个人签名 2022.07.22 加入

还未添加个人简介

评论

发布
暂无评论
开源一夏 | Java格式化日期 微秒_开源_六月的雨在infoQ_InfoQ写作社区