大概有5个多月没更,又懒又忙,公司用mac,回家用台式,这快捷键的切换对我来说真是。。。。太难了。不过再懒再忙再难也要学习呀,毕竟落后就要挨打,加油加油加油~~~
在实际的业务开发中,不免会用到几类日期相关类:Date、SimpleDateFormat、Duration、Calendar 以及 DateUtils等,下面就来详细介绍下,做个笔记,也希望对其他人有所帮助。
最常用的基础日期类 继承Serializable, Cloneable, Comparable
public class Date
implements java.io.Serializable, Cloneable, Comparable
多个构造函数
// 构造函数(初始化时间为当前系统时间)
public Date() {
this(System.currentTimeMillis());
}
// 有参构造函数(初始化时间为date)
public Date(long date) {
fastTime = date;
}
常用方法:after,before,compareTo等
/**
* description :
*
* @author survivor
* @Date 2020/08/01
*/
public class Demo {
public static void main(String[] args) {
// Date 类
Date date = new Date();
System.out.println(date);
long timeStamp = 1595214000000L;
Date date1 = new Date(timeStamp);
System.out.println(date1);
System.out.println(date.compareTo(date1)); // -1,0,1
System.out.println(date.before(date1)); // true or false
System.out.println(date.after(date1)); // true or false
}
}
Date 类输出的时间格式是固定的,如果想要程序输出我们想要的时间格式,就会用到 SimpleDateFormat 这个类
public class Demo {
public static void main(String[] args) {
// SimpleDateFormat 类
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
String currentTime = sdf.format(new Date());
System.out.println(currentTime);
}
}
这里要特别注意的是大小写的区分
还有一个需要特别注意的点:SimpleDateFormat是线程不安全的,在多线程的时候需要考虑并发编程,一般不要定义为static变量,如果要定义为static,需要加锁,或者采用DateUtils工具类
private static final ThreadLocaldf =new ThreadLocal(){
@Override
protected DateFormat initialValue(){
return new SimpleDateFormat("yyyy-MM-dd");
}
};
线程安全的,旨在计算时间段的mills,nanos。
public final class Duration
implements TemporalAmount, Comparable, Serializable
public class Demo {
public static void main(String[] args) {
// Duration 类
long timeStamp=1596168115000L;
long currentTime= System.currentTimeMillis();
System.out.println(Duration.ofMillis(currentTime-timeStamp).toDays()); // toDays计算方式是“/”
// 上面是ms,这里是s
long test1=1596341581L;
long test2 = 1596168115L;
System.out.println(Duration.ofSeconds(test1-test2).toDays());
}
}
在Date类大部分的方法都已经被废弃了(可以去看下Date的源码),所以就出现了Calendar类,基本Date能做的事情,Calendar都可以做得到。
public abstract class Calendar implements Serializable, Cloneable, Comparable
虽然Calendar是个抽象类,但它可以通过 Calendar.getInstance() 进行实例化,Calendar可以操作日期的年月日。一般在实际业务中,如果要从自然日的维度考虑问题,就需要将小时,分钟以及秒等置为相同的数据,或固定的时间(都是零点),便于计算和统计,比如这里
public class Demo {
public static void main(String[] args) {
// Calendar 类
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date(System.currentTimeMillis()));
// 获取当天的小时,分钟,秒,毫秒
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
int mills = calendar.get(Calendar.MILLISECOND);
System.out.println(calendar.getTime());
System.out.println(hour);
System.out.println(minute);
System.out.println(second);
System.out.println(mills);
// 将小时,分钟,秒,毫秒置为0
long millSecondPassedToday = ((hour*60+minute)*60+second)*1000+mills;
calendar.setTimeInMillis(calendar.getTimeInMillis()-millSecondPassedToday);
System.out.println(calendar.getTime());
}
}
这是个非常实用的日期工具类,入参和出参基本是Date,Calendar或者long类型,便于操作,在实际开发过程中,可以继承这个类开发个性化日期工具类供项目团队使用,感兴趣的可以去看下源码,封装了很多好的方法。
public class Demo {
public static void main(String[] args) {
// DateUtils 类
System.out.println(DateUtils.isSameDay(new Date(),new Date()));
}
}
注意:在线程安全方面可以用Instant代替Date,LocalDateTime代替Calendar,DateTimeFormatter代替SimpleDateFormat。
不断学习不断补充中~~~