java 时间处理类

Date类

  • java.util.Date类表示特定的瞬间。
  • Date() 使用系统当前的时间创建 一个Date实例
  • 内部就是使用System. currentTimeMillis()获取系统当前时间的毫秒数来创建Date对象
  • Date(long dt) 使用自1970年1月1日00:00:00 GMT以来的指定毫秒数创建 一个Date实例常用方法
  • Date 常用方法

            Date date = new Date();
            System.out.println(date);   //Tue Aug 02 21:38:31 GMT+08:00 2022
            System.out.println(date.getTime());   //1659447511347
            System.out.println(date.toString());   //Tue Aug 02 21:38:31 GMT+08:00 2022
    
  • SimpleDateFormat 类

    提供了对 Date 类时间的格式化 ,和 对Date 和 String之间相互转换

    
     SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
      String format = simpleDateFormat.format(date);
      System.out.println(format);
      String str = "2022-08-01 09:02:43";
      try {
          Date parse = simpleDateFormat.parse(str);
          System.out.println(simpleDateFormat.format(parse));
      } catch (ParseException e) {
          e.printStackTrace();
      }
    

format( )方法 ===== Date 转 String

parse( ) ========== String 转 Date 这里的String必须是年月日 加 时分秒 都有 ,而且必须是 “2022-08-01 09:02:43” 格式 ,年月日与时分秒之间的空格可以有多个,至少一个空格

jdk 1.8 新的时间处理类

LocalDate
  • LocalDate 是 默认格式就是yyyy-MM-dd 的格式,显示年月日

  • LocalDate 构造方法为私有的,所以不能 new 对象,可以通过里面的静态方法获得对象 ,例如 now( ) , of( )

//构造方法

private LocalDate(int year, int month, int dayOfMonth) {
this.year = year;
this.month = (short) month;
this.day = (short) dayOfMonth;
}


  • 使用如下:
       //now( ) 获取当前系统时间
        LocalDate localDate = LocalDate.now();
        System.out.println(localDate);  //  2022-08-03
        System.out.println("年:  "+localDate.getYear());  // 年:  2022
        System.out.println("月(英文):"+localDate.getMonth()); //  月(英文):AUGUST
        System.out.println("月(数字) :"+localDate.getMonthValue());  // 月(数字) :8
        System.out.println("周几: "+localDate.getDayOfWeek());  // 周几: WEDNESDAY 
        System.out.println("日  "+localDate.getDayOfMonth());    //  日  3

         //加减日期
        LocalDate changs =localDate.plusYears(2);
        System.out.println("+ 后 "+changs.getYear());  // + 后 2024
        //改变当前对象 ;
        LocalDate withYear=localDate.withYear(2025);
        System.out.println("改变后 "+withYear.getYear());  //  改变后 2025

        System.out.println(changs.isAfter(localDate)); //  true

        System.out.println(localDate.compareTo(changs)); // -2


compareTo( ) 比较日期方法 里调用了 compareTo0,

int compareTo0(LocalDate otherDate) {
   int cmp = (year - otherDate.year);
   if (cmp == 0) {
       cmp = (month - otherDate.month);
       if (cmp == 0) {
           cmp = (day - otherDate.day);
       }
   }
   return cmp;
}

从源码看到 ,若年份有差别,直接返回,不同才会依次去比较月份和天数

LocalDateTime

LocalDateTime 是 默认格式就是yyyy-MM-ddTHH:mm:ss 的格式,显示年月日 时分秒, 秒会精确到毫秒级别

		LocalDateTime dateTime =LocalDateTime.now();
        System.out.println(dateTime);    //2022-08-03T10:30:02.105
LocalTime

LocalTime 是 默认格式就是 HH:mm:ss 的格式,显示 时分秒,秒会精确到毫秒级别

     LocalTime localTime = LocalTime.now();   
     System.out.println(localTime);   //   10:36:04.942
DateTimeFormatter

自定义格式类 ,适用于jdk1.8 新的时间处理类

        LocalDateTime dateTime =LocalDateTime.now();
        System.out.println(dateTime);    //2022-08-03T10:30:02.105

//    时间 转 String
        DateTimeFormatter dateTimeFormatter =  DateTimeFormatter.ofPattern("y-M-d H:m:s");
        String time = dateTimeFormatter.format(dateTime);    
        System.out.println(time);   // 2022-8-3 10:30:2

//  String 转 时间

		String str ="2022-8-3 9:36:20";
        LocalDateTime localDateTime = LocalDateTime.parse(str,dateTimeFormatter);
        System.out.println(localDateTime);  //   2022-08-03T09:36:20

DateTimeFormatter String 转 时间时 ,String 的格式与 SimpleDateFormat 不同,年月日与时分秒之间有且仅有有一个空格;

jdk 1.8 新时间处理类与Date 类的转换

以LocalDateTime为例

Date --》 LocalDateTime

  
        Date date = new Date();
        Instant instant = date.toInstant();
        ZoneId zoneId = ZoneId.systemDefault();

        LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime();
        System.out.println("Date = " + date);
        //  Date = Wed Aug 03 11:04:13 GMT+08:00 2022
        System.out.println("LocalDateTime = " + localDateTime);
        //   LocalDateTime = 2022-08-03T11:04:13.277

// 还可以
	  	LocalDateTime localDateTime1 = LocalDateTime.ofInstant(date.toInstant(), zoneId);
        System.out.println(localDateTime1);

        

LocalDateTime --》Date

 		ZoneId zoneId = ZoneId.systemDefault();
        LocalDateTime localDateTime = LocalDateTime.now();
        ZonedDateTime zdt = localDateTime.atZone(zoneId);

        Date date = Date.from(zdt.toInstant());

        System.out.println("LocalDateTime = " + localDateTime);
        //  LocalDateTime = 2022-08-03T11:10:20.439
        System.out.println("Date = " + date);
        //  Date = Wed Aug 03 11:10:20 GMT+08:00 2022

时间差异类 Duration & Period

  • Duration 与 LocalDateTime
  		//日期相差对象 Duration
        LocalDateTime change = LocalDateTime.of(2024,12,5,14,20,23);
        //后面的-前面的参数 ;
        Duration duration =  Duration.between(dateTime,change);

        System.out.println(duration.toDays()); //天数
        System.out.println(duration.toHours()); //小时
        System.out.println(duration.toMinutes()); //秒
        System.out.println(duration.toMillis());  //毫秒
  • Period 与 LoaclDate

     		LocalDate localDate1 = LocalDate.now();  //2022-08-03
            LocalDate localDate2 = LocalDate.of(2024,12,5);
            //后面的-前面的参数 ;
            Period period =  Period.between(localDate1,localDate2);
    
            System.out.println(period.getDays()); //天数   2 = 5-3  (今天是8月3号)
            System.out.println(period.getYears()); //年    2
            System.out.println(localDate2.toEpochDay()-localDate1.toEpochDay());  //总天数 855    
    //toEpochday()是1970-1-1 到该日期的天数
            System.out.println(period.getMonths()); //月    4 = 12 -8
            System.out.println(period.toTotalMonths());//总月数   28
    

    用Duration 去比较 Localdate 时会抛异常,???

    		LocalDate localDate = LocalDate.now();
            LocalDate change = LocalDate.of(2024,12,5);
            // atStartOfDay() 将LocalDate 转成 LocaDateTime  时分秒用 00:00:00 补齐
            Duration duration =  	Duration.between(localDate.atStartOfDay(),change.atStartOfDay());
    
            System.out.println(duration.toDays()); //天数
            System.out.println(duration.toHours()); //小时
            System.out.println(duration.toMinutes()); //秒
            System.out.println(duration.toMillis());  //毫秒
    

    至于为什么 Duration.between( ),不能传2个LocalDate对象? 源码翻译后解释:不能获取时间对象的秒数,抛出DateTime异常! 不懂

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值