Java常见日期时间类

前言

发中,我们经常与日期时间类打交道,比如数据库中常用的datetime与Java中的时间类型作转换,还有前端传过来的时间字符串处理等等。接下来,我们来熟悉一些常用的日期时间API。具体分为jdk1.8之前和jdk1.8后(含1.8)两类

JDK1.8之前日期时间类

jdk1.8前,常用时间日期类主要有System.currentTimeMillis(),java.util.Date类,java.sql.Date类,SimpleDateFormat,下面简单说说各个类的主要用法和运用场景

  • System.currentTimeMillis()
    获取当前时间与1970年1月1日0时0分0秒以毫秒为单位时间差,通常运用于测量程序的耗时。如下面程序获取String作循环拼接的耗时:
@Test
public void test(){
	    Long startTime=0L;
        Long  endTime=0L;
        String text="";
        System.out.println("-----String开始-----");
        startTime=System.currentTimeMillis();
        for (int i = 0; i <10000 ; i++) {
            text+=i;
        }
        endTime=System.currentTimeMillis();
        System.out.println("-----String耗时:"+(endTime-startTime)+"ms");
}
  • java.util.Date类
    获取当前时间的Date对象,并转化为标准日期格式,也可以获取时间戳。但是此类很多方法都被丢弃了,主要剩下Date(),Date(long),其他方法不推荐使用
    在这里插入图片描述

Date类相关API代码测试:

 @Test
    public  void test2(){
        //获取当前时间的Date对象
        Date date=new Date();
        System.out.println("时间戳:"+date.getTime());//时间戳:1587310813604
        System.out.println("标准格式:"+date.toString());//标准格式:Sun Apr 19 23:40:13 CST 2020
}
  • java.sql.Date类
    针对SQL语句使用的,它只包含日期而没有时间部分,java.util.Date 是 java.sql.Date 的父类(注意拼写)前者是常用的表示时间的类,我们通常格式化或者得到当前时间,后者是在读写数据库的时候用到。一般在做数据库时间插入操作时,首先获取当前的普通日期时间,再通过getTime获取当前时间戳并传入java.sql.Date的构造方法,转换如下:
    @Test
    public  void test2(){
	//java.util.Date=>java.sql.Date
        Date date=new Date();
        //传入java.util.Date的getTime
        java.sql.Date sqlDate=new java.sql.Date(date.getTime());
        //获取sql日期
        System.out.println("sql:"+sqlDate);//sql:2020-04-20
	
	//java.sql.Date=>java.util.Date
	Date date1=new Date(sqlDate.getTime());
        System.out.println(date1);//Mon Apr 20 15:28:08 CST 2020
}

其实主要了解java.util.Date和java.sql.Date可以互转,若不设计数据库时间字段,通常用java.util.Date,还有java.sql.Date只有日期部分。

  • SimpleDateFormat
    通常用于对Date类的格式化与解析,指定我们需要的日期格式,比较实用。
    格式化:日期–>字符串
    解析:字符串–>日期
 @Test
    public  void test2(){
        //指定需要的格式,如:yyyy-MM-dd
        SimpleDateFormat  sdf=new SimpleDateFormat("yyyy-MM-dd");
        Date xfDate=new Date(); //获取Date
        //格式化
        String dateStr=sdf.format(xfDate);
        System.out.println("str:"+dateStr);//str:2020-04-20

        //定义时间格式字符串。注:这里的格式必须与SimpleDateFormat指定的格式一致,不然会报错
        String str="2020-04-19";
        try {
            Date newDate=sdf.parse(str);
           //输出:Sun Apr 19 00:00:00 CST 2020,由于在SimpleDateFormat中指定时间部分,所以默认为0时0分0秒 
	   System.out.println(newDate); 
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

掌握SimpleDateFormat的日期时间的格式化和解析,指定好需要的格式,若没有手工指定,会给出默认的格式。

jdk8时间新API

由于在jdk8前的相关日期时间API存在很多不方便,比如java.util.Date类中的很多方法都是丢弃的,其中Calendar类的get,set都不是很友好,按理说,时间是不可变的。所以,在jdk8后,推出了更合适的日期时间类:LocalDate,LocalDateTime,LocalTime,DateTimeFormatter,分别为日期类,日期时间类,时间类,都是不可变类,位于java.time包下。用final修饰,表示不可变性,符合日常的时间规范,减少开发人员的困扰,降低学习的门槛。下面简单介绍常用的API:

  • 通过now()获取当前时间
 @Test
    public void test1(){
       //获取当前日期
       LocalDate localDate=LocalDate.now();
       //获取当前日期时间
       LocalDateTime localDateTime=LocalDateTime.now();
       //获取当前时间
       LocalTime localTime=LocalTime.now();
       System.out.println("Date:"+localDate);//Date:2020-04-20
   System.out.println("DateTime:"+localDateTime);//DateTime:2020-04-20T17:53:58.302
       System.out.println("Time:"+localTime);//Time:17:53:58.302
}
  • 通过of(),设置日期时间并返回一个日期时间对象
    我们可以手动指定日期时间,通过of(),不同的对象有不同的指定参数,下面以LocalTime为例:
 @Test
    public void test(){
	 //获取当前时间
        LocalTime localTime=LocalTime.now();
        LocalTime localTime1=LocalTime.of(20,8,8);//指定时分秒
        System.out.println("Time:"+localTime);  //Time:18:01:57.473,不可变,不会因of的指定而改变,符合日常的时间习惯
        System.out.println("newTime:"+localTime1);//newTime:20:08:08,手动指定的时分秒
}

同理LocalDate,LocalDateTime也有类似用法,这里就不再一一举例了。

  • 获取具体的年月日时分秒
    jdk8提供的日期时间类,能够方便我们快速获取到该时间对象的具体年月日时分秒
@Test
    public void test(){
        //获取年月日
        LocalDateTime dateTime=LocalDateTime.now();
        int year=dateTime.getYear();
        int month=dateTime.getMonthValue();
        int day=dateTime.getDayOfMonth();
        System.out.println(dateTime);//2020-04-20T19:15:37.185
        System.out.println(year+"年,"+month+"月,"+"第"+day+"天");//2020年,4月,第20天

        //获取时分秒
        LocalTime time=LocalTime.now();
        int hour=time.getHour();
        int minute=time.getMinute();
        int seconds=time.getSecond();
        System.out.println(time);//19:15:37.185
        System.out.println(hour+"时,"+minute+"分,"+seconds+"秒");//19时,15分,37秒
    }

获取到日期时间类后,可以通过getXXX()就能获取到具体的年月日时分秒。这些在jdk8之前的java.util.Date类无法实现的。

  • DateTimeFormatter
    格式化或解析日期、时间,类似jdk8之前的SimpleDateFormat。
@Test
    public  void  test5(){
        LocalDateTime localDateTime=LocalDateTime.now();
        //使用DateTimeFormatter自带的格式
        DateTimeFormatter df=DateTimeFormatter.ISO_DATE_TIME;
        String timeStr=df.format(LocalDateTime.now());
        System.out.println("str:"+timeStr);
        //保证字符串格式满足DateTimeFormatter的格式约定
        TemporalAccessor parse = df.parse("2020-04-19T22:23:12.372");
        System.out.println("afterParse:"+parse);
        DateTimeFormatter myFormatter=DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);
     System.out.println("res:"+myFormatter.format(localDateTime));

        //自定义格式
        DateTimeFormatter dateTimeFormatter=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
      System.out.println(dateTimeFormatter.format(localDateTime));
        //解析
        TemporalAccessor parse1 = dateTimeFormatter.parse("2020-04-19 22:32:10");
        System.out.println(parse1);
    }

DateTimeFormatter有自带的默认格式,当然也可以自定义格式,通过ofPattern()指定,再调用format(localDateTime)即可实现日期时间格式化。对应也提供parse()方法实现日期格式字符串的解析,其中FormatStyle.MEDIUM返回日期时间中等文本风格,除此还有FormatStyle.LONG,FormatStyle.SHORT等。

  • 获取某个时间段
    在某些开发场景中,我们需要获取最近三天的时间作为筛选条件,去数据库进行查询。通过Jdk8时间API很容易就能做到:
 @Test
    void test() {
        //当前时间
        LocalDate now = LocalDate.now();
        LocalDate third = now.plusDays(2);//第三天日期
        LocalTime min = LocalTime.MIN;
        LocalTime max = LocalTime.MAX;
        LocalDateTime start = LocalDateTime.of(now, min);
        LocalDateTime end = LocalDateTime.of(third, max);

        String s=start.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        String e=end.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        System.out.println(s);
        System.out.println(e);
        //伪SQL
        /**
         *  select *  from  tb1 where start_time between #{s} and ${e}
         */

    }

总结

通过jdk8之前和之后的日期时间API进行了对比,了解各个日期时间类的运用场景,jdk8后的日期类比jdk8之前的日期类更为强大,更灵活,学习门槛也较低,推荐学习使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值