java中时间类的详细总结

  • 目录
  • Date类
  • getTime()的使用
  • Calendar类
  • SimpleDateFormat类
  • java8中新时间
  • LocalDate类
  • LocalTime类
  • 时区
  • period类
  • DateTimeFormat类


目录

Date类

Date类中有两个构造方法,public Date() 和 public Date(long date) 可以用来表示当前的日期,或者将长整形数据表示成时间。

public void test() {
	Date a = new Date();    //创建date对象,打印当前的日期和时间
	System.out.println(a);
	
	//输出>>>Fri May 07 08:35:23 CST 2021
	
	Date b = new Date(1000);   //参数是从1970年1月1日 00:00:00 GMT以来的毫秒数
	System.out.println(b);
	
	//输出>>>Thu Jan 01 08:00:01 CST 1970

getTime()的使用

getTime():表示1970年1月1号00:00:00到当前时刻的毫秒数,常用于时间计算的转化。

public void test0() {
		Date a = new Date();    //getTime() 表示1970年1月1号00:00:00到当前时刻的毫秒数
		System.out.println(a.getTime());
		
		//输出>>>1620348546366

Calendar类

Calendar是一个抽象类,它为日历字段之间的转换提供了一些方法,也为操作日历字段提供了一些方法。
1:获取当前的日期

Calendar a = Calendar.getInstance();  //获取当前日期
		
		System.out.print("年:"+a.get(Calendar.YEAR));
		System.out.print("月:" +a.get(Calendar.MONTH));
		System.out.print("日:"+ a.get(Calendar.DAY_OF_MONTH));
		System.out.print("时:"+ a.get(Calendar.HOUR_OF_DAY));
		System.out.print("分:"+ a.get(Calendar.MINUTE));
		System.out.print("秒:"+ a.get(Calendar.SECOND));
		
		//输出>>>年:2021月:4日:7时:8分:57秒:56

2:设置日期

Calendar b = Calendar.getInstance();
		b.set(2021, 10, 1);
		System.out.println(b);   //指定一个日历将其打印出来  。注意:月份是从0开始计算,故要在所指定的月份基础上减1

3:日期的相关运算

Calendar a = Calendar.getInstance();  //获取当前日期
		Calendar b = Calendar.getInstance();
		
		a.add(Calendar.DATE, 15);   //add.() 可以做日期的运算
		System.out.print(a.get(Calendar.DATE)+"\t");
		
		a.add(Calendar.YEAR, 2);
		System.out.println(a.get(Calendar.YEAR)+"年");
		
		//输出>>>22	2023年
		
		if(a.before(b)) {          //比较两个日期哪一个在前
			System.out.println("是");
		}else {
		System.out.println("否");
	}
		
		//输出>>>否
		
       System.out.println(a.after(b));    //比较两个日期哪一个在后
       
       //输出>>>true
	}

SimpleDateFormat类

使用SimpleDateFormat可以实现字符串和日期之间的相互转化
1:将字符串转化为日期

public void test() throws ParseException {   //将字符串String转换为日期Date
		String str = "2021-05-06 11:22";
		SimpleDateFormat asd = new SimpleDateFormat("yyyy-MM-dd hh:mm");
		Date as = asd.parse(str);
		System.out.println(as);
	}
	  //输出>>>Thu May 06 11:22:00 CST 2021

2:日期转化为字符串

public void test2() {
		Date da = new Date();
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");  //此时间格式由自己规定
	    System.out.println(	sdf.format(da));   //将日期Date转化为字符串String
	}
	  //输出>>>2021-05-07 09:16:22

3:小练习:随意输入一个日期判断是周几

public void testRen() throws ParseException {
		String str = "2021/05/06";
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
		Date date = sdf.parse(str);   //完成将字符串转化为日期
		
		Calendar ca = Calendar.getInstance();
		ca.setTime(date);   //将日期转化为calendar
		System.out.println(ca.get(Calendar.DAY_OF_WEEK)-1);
	}
	      //输出>>>4

java8中新时间

LocalDate类

只针对 年 月 日 做出处理,使用起来方便简单灵活,LocalDate线程安全,不用考虑高并发问题

LocalDate od = LocalDate.now();    // 获取当前日期
		System.out.println(od);
		
		//输出>>>2021-05-07
		
		System.out.print(od.getYear()+"年");   //获取年,月,日
		System.out.print(od.getMonthValue()+"月");
		System.out.print(od.getDayOfMonth()+"日");
		
		//输出>>>2021年5月7日
		
		System.out.println(od.isLeapYear());   //直接判断是否为闰年
		
		//输出>>>false
		
		LocalDate oda = LocalDate.parse("2021-05-07");
		System.out.print(od.compareTo(oda)+"\t");   //比较两日期 “日” 相差多少天
		System.out.println(od.equals(oda));     //用于比较两日期是否相同
		
		//输出>>>0	true
		
		od = od.plusDays(5);  //加
		System.out.println("五天以后的日期:"+od);
		
		//输出>>>五天以后的日期:2021-05-12
		
		od = od.minusMonths(3);
		System.out.println("三个月以前的日期:"+od);
		
		//输出>>>三个月以前的日期:2021-02-12

LocalDate与Date之间的相互的转换

/**
      * Date---LocalDate
      */
     public void test6() {
    	 Date t = new Date();
    	 System.out.println("Date:"+t);
    	 LocalDate dt = t.toInstant()
    			 .atZone(ZoneId.systemDefault())  //默认时区
    			 .toLocalDate(); //转化
    	 System.out.println("LocalDate:"+dt);
    	
    	 //输出>>>Date:Fri May 07 09:50:46 CST 2021
    	 //       LocalDate:2021-05-07     
    	 
    	 
    	 /**
    	  * LocalDate---Date
    	  */
    	 
    	 ZonedDateTime adt = LocalDate.now()
    			 .atStartOfDay(ZoneId.systemDefault());
    	 Date d =Date.from(adt.toInstant());
    	 System.out.println(d);
    	 
    	 //输出>>>Fri May 07 00:00:00 CST 2021

LocalTime类

LocalTime只针对 时 分 秒 做出处理

/**
	 * Localtime
	 */
     @Test
     public void test1() {
    	 LocalTime to = LocalTime.now();   //获取当前时刻
    	 System.out.println(to);
    	 
    	 System.out.println(to.plusHours(6));  //加
    	 
    	 System.out.println(to.minusHours(3));  //减
    	 
    	 //输出>>>09:57:59.861
    	 //输出>>>15:57:59.861
    	 //输出>>>06:57:59.861

时区

全球分为24个时区,相邻时区时间相差1个小时。比如北京处于东八时区,东京处于东九时区,北京时间比东京时间晚1个小时,而英国伦敦时间比北京晚7个小时(英国采用夏令时时,8月英国处于夏令时)。

比如此刻北京时间是2017年8月24日11:17:10,则东京时间是2017年8月24日12:17:10,伦敦时间是2017年8月24日4:17:10。

@Test
     public void test2() {
    	TimeZone timeZone = TimeZone.getTimeZone("GTM+8");
    	System.out.println("默认时区:"+TimeZone.getDefault().getDisplayName());
    	System.out.println(timeZone.getDisplayName());
     }
        
     //输出>>>默认时区:中国标准时间
     //输出>>>格林威治时间

period类

period类表示一段时间的年,月,日 用between()方法获取两个日期之间的差

/**
      * period类
      */
     
     
     @Test
     public void test3() {
    	 LocalDate startda = LocalDate.parse("2021-02-05");
    	 LocalDate endda = LocalDate.parse("2021-05-06");
    	 
    	 Period pd = Period.between(startda, endda);
    	 
    	 System.out.println("相差多少月:"+pd.getMonths()); //只针对月份
    	 System.out.println("相差多少天:"+pd.getDays());    //只针对天数
    	 
    	 long sa = endda.toEpochDay()-startda.toEpochDay();
    	 System.out.println("两日期之间相差多少:"+sa+"天");    //考虑月份与天数相差多少天
    	 
    	 //输出>>>相差多少月:3
    	 //输出>>>相差多少天:1
    	 //输出>>>两日期之间相差多少:90天
     }

DateTimeFormat类

线程安全,可用于字符串与日期之间的相互转换

/**
      * DateTimeFormat
      */
     @Test
     public void testF() {
    	DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd");
    	LocalDate od = LocalDate.parse("2021/05/07",dtf);
    	System.out.println(dtf.format(od));
		 
		//输出>>>2021/05/07

     }