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),方便大家查阅哈
评论