我正在参与「启航计划」
一、前言
大家在开发过程中必不行少的和日期打交道,对接别的体系时,时刻日期格局不一致,每次都要转化!
每次写完就忘记了,小编专门来整理一篇来详细说一下他们四个的转化的办法,便当后边运用!!
二、LocalDateTime、LocalDate、Date三者联络
这儿先说一下,为什么日期有Date
了,还在JDK8
中推出了LocalDateTime、LocalDate
呢?
原因Date:
-
非线程安全的办法
Date类的大部分办法都不是线程安全的,比方
setYear()、setMonth()、setDate()、setHours()、setMinutes()、setSeconds()
等办法。这些办法都可以修正Date目标的内部状况。假如多个线程
一起拜访和修正同一个Date
目标,就会产生竞态条件,导致程序出现错误的成果。 -
大局变量的运用
Date类有两个静态变量,分别是
DateParser
和CalendarSystem
。这两个变量是大局共享
的,假如多个线程一起拜访和修正这两个变量,也会导致程序出现竞态条件。
因而,假如需求在线程中运用日期时刻相关的操作,主张运用线程安全的日期时刻类,比方JDK8中引进的新日期时刻API中的LocalDateTime、LocalDate
等类,或者运用线程安全的DateFormat和Calendar
类。
咱们在说一下LocalDateTime他们是怎么完成线程安全的:
LocalDateTime它是由LocalDate和LocalTime两个不行变的类组成的。LocalDate和LocalTime各自都是线程安全的,它们的时刻信息都是基于UTC
(和谐世界时)计算的,而且不依赖于体系的时区设置。LocalDateTime也是相同,它是由体系时区和UTC计算得到的。
有兴趣的可以看一下:和谐世界时介绍
这些类主要是运用了以下两个技能来处理线程安全问题:
-
不行变性:这些类都是不行变的,一旦创立后,就不能再被修正。因而,就不存在并发修正的问题了。
-
线程封闭性:这些类的构造办法都是线程安全的,而且不允许外部修正其间的状况。因而,就不需求通过锁或其他机制来维护它们的状况。
综上所述,Java 8中的新日期时刻API通过不行变性
和线程封闭性
等技能,有效地处理了线程安全问题。这使得开发者们可以更加安全和便当地在多线程环境下运用日期时刻类。
基本上新的体系都会运用LocalDateTime来作为日期时刻,削减并发问题!
三、相互转化例子
1. LocalDate转String
LocalDate类有一个format()办法,可以将日期转成字符串。format()办法需求一个DateTimeFormatter目标作为参数。以下代码示例中,咱们将日期目标转化为字符串。
String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
System.out.println("当时字符串日期:" + dateStr);
2. String转LocalDate
咱们可以运用parse()办法从字符串中解析日期目标
LocalDate date = LocalDate.parse(dateStr);
System.out.println("日期目标:" + date);
3. LocalDateTime转String
同样,咱们可以运用DateTimeFormatter类将LocalDateTime类型的日期目标格局化为字符串。
String dateTimeStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println("当时字符串日期时刻:" + dateTimeStr);
4. String转LocalDateTime
咱们也可以运用parse()办法从字符串中解析日期时刻目标。
LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println("当时日期时刻目标:" + dateTime);
因为Java 8之前的版别运用Date类处理日期时刻,因而将Java 8日期时刻转化为Date类型很常见,咱们可以运用如下办法进行操作。
5. LocalDate转Date
Date dateNew1 = Date.from(date.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
System.out.println("当时日期目标转date:" + dateNew1);
6. LocalDateTime转Date
Date dateNew2 = Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());
System.out.println("当时日期时刻目标转date:" + dateNew2);
7. Date转LocalDate
LocalDate localDate = dateNew2.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
System.out.println("当时date转日期目标:" + localDate);
8. Date转LocalDateTime
LocalDateTime localDateTime = dateNew2.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
System.out.println("当时date转日期时刻目标:" + localDateTime);
9. Date相互转String
可以自己抽离一个办法,依据格局化来转化为自己想要的格局!也可以运用三方的格局转化,比方:hutool
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("date转String字符串:" + df.format(dateNew2));
DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("String字符串转date:" + df1.parse(dateTimeStr));
需求留意的是
SimpleDateFormat
是线程不安全的类,不适用于多线程环境,所以在实践开发中需求留意线程安全问题。可以考虑运用ThreadLocal
来处理线程安全问题。
public class ThreadSafeDateFormat {
private ThreadLocal<DateFormat> dateFormatThreadLocal = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
public DateFormat get() {
return dateFormatThreadLocal.get();
}
}
ThreadSafeDateFormat dateFormat = new ThreadSafeDateFormat();
System.out.println("date转String字符串安全版:" + dateFormat.get().format(dateNew2));
System.out.println("String字符串转date安全版:" + dateFormat.get().parse(dateTimeStr));
四、总结
需求留意的是,在运用时需求留意时区和时刻戳的问题,否则可能会出现一些错误。
总归,熟练掌握这些类型之间的转化方式可以进步咱们的开发效率,也可以避免一些常见的错误,在实践开发中可以更加高效地处理日期时刻相关的任务。
假如对你有协助,还请动一下您的发财小手,重视一下公众号:『小王博客基地』!!谢谢您的重视!!