Java 日期相关工具类

大概有5个多月没更,又懒又忙,公司用mac,回家用台式,这快捷键的切换对我来说真是。。。。太难了。不过再懒再忙再难也要学习呀,毕竟落后就要挨打,加油加油加油~~~


在实际的业务开发中,不免会用到几类日期相关类:Date、SimpleDateFormat、Duration、Calendar 以及 DateUtils等,下面就来详细介绍下,做个笔记,也希望对其他人有所帮助。

一、Date 类 (java.util.Date)

最常用的基础日期类 继承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
    }
}

二、SimpleDateFormat 类 (java.text.SimpleDateFormat)

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);
    }
}

这里要特别注意的是大小写的区分

  • YYYY表示week in which year,只要本周跨年,返回的就是下一年(特别注意) 
  • yyyy表示当天所在的年
  • M表示月份
  • m表示分钟
  • H表示24小时制
  • h表示12小时制
  • S表示毫秒
  • s表示秒
  • D表示本年的当天
  • d表示本月的当天

还有一个需要特别注意的点:SimpleDateFormat是线程不安全的,在多线程的时候需要考虑并发编程,一般不要定义为static变量,如果要定义为static,需要加锁,或者采用DateUtils工具类

    private static final ThreadLocaldf =new ThreadLocal(){
        @Override
        protected DateFormat initialValue(){
            return new SimpleDateFormat("yyyy-MM-dd");
        }
    };

三、Duration 类(java.time.Duration)

线程安全的,旨在计算时间段的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());
    }
}

四、Calendar 类(java.util.Calendar)

在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());
    }
}

五、DateUtils 类(org.apche.commons.lang3.time.DateUtils)

这是个非常实用的日期工具类,入参和出参基本是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。

不断学习不断补充中~~~

 

 

你可能感兴趣的:(Java,基础)