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异常! 不懂