一、Date
Date date = new Date();
System.out.println(date);// 打印处当前时间,但是格式是原始格式
date.getTime(); //获取从标准基准时间到现在时间的毫秒值,是一个时间差
date.setTime(long variable); //打印的是在基础时间上经过t的时间
二、SimpleDateFormat
Date date = new Date();
SimpleDateFormate sdf = new SimpleDateFormate(yyyy-MM-dd HH:mm:ss);
sdf.formate(date); //按照yyyy-MM-dd HH:mm:ss格式生成的时间
String date = "2022-8-4 20:20:20";
SimpleDateFormat simpledateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss);
simpledateformat.parse(date);//获取的是date原始格式的2022-8-4 20:20:20的时间
三、Calendar
//1.获取日历对象
Calendar c = Calendar.getInstance();
//通过获取到的日历对象,调用get(),传入对应的日历字段,就可以拿到对应的值
c.get(Calendar.YEAR); //获取年
c.get(Calendar.MONTH)+1; //获取月,因为是从0开始
c.get(Calendar.DAY_OF_MONTH); //获取日
c.add(Calendar.YEAR,+10); //给指定的日历字段进行指定数目的加减操作,得到10年后的今天
c.set(2099,9,1); //设置2099年9月1日
四、LocalDate
用来获取和计算日期。
LocalDate date = LocalDate.now();//获取当前日期 2022-08-04
System.out.println(date.getYear());//获取当前的年
System.out.println(date.getMonth());//获取当前的月
System.out.println(date.getDayOfMonth());//获取当前的日
LocalDate date = LocalDate.now();//获取当前日期2022-08-04
LocalDate date2= LocalDate.parse("2030-11-10");//将字符串解析为LocalDate对象 2030-11-10
System.out.println(date.compareTo(date2));//两个日期的年份/月份/日的差值 -8,compareTo():显示比较年份,如果年份不同,直接返回年份的差值。如果年份相同,再比较月份,如果如果月份不相同,返回月份的差值。如果月份也相同返回日期的差值。
System.out.println(date.equals(date2));//判断两个日期是否相等:false
System.out.println(date.isLeapYear());//判断date日期是否为闰年//false
date =date.plusMonths(3);//当前日期加3个月
date =date.minusMonths(3);//date日期减3个月
LocalDate startDate = LocalDate.parse("2021-04-05");
LocalDate endDate = LocalDate.parse("2021-05-05");
Period p =Period.between(startDate, endDate);//表示两个时间段之间的日期
System.out.println("年份相差多少年"+p.getYears());//判断年:0
System.out.println("月份相差多少月"+p.getMonths());//判断月:1
System.out.println("日相差多少日"+p.getDays());//判断日:0
long s =endDate.toEpochDay()-startDate.toEpochDay();
System.out.println("两个日期相差多少天"+s);//30
五、LocalTime
LocalTime t =LocalTime.now();//获取当前时间
System.out.println(t.plusHours(2));//当前时间加两小时
System.out.println(t.minusMinutes(5));//当前时间减五分钟
六、LocalDateTime
LocalDateTime dateTime = LocalDateTime.now();//获取日期时间对象 2022-08-04T21:23:42.139
//年
int year = dateTime.getYear();
System.out.println("年="+year);
//月 获取月份有两种方式:
// 方式一:
Month month = dateTime.getMonth();//获取的返回是英文
System.out.println("月="+month);
// 方式二:
int monthValue = dateTime.getMonthValue();
System.out.println("月="+monthValue);
// 日
int dayOfMonth = dateTime.getDayOfMonth();
System.out.println("日="+dayOfMonth);
// 时
int hour = dateTime.getHour();
System.out.println("时="+hour);
//分
int minute = dateTime.getMinute();
System.out.println("分="+minute);
//秒
int second = dateTime.getSecond();
System.out.println("秒="+second);
———————————————————————————————————————————————————————————————————————————————————————————————————————————————
// 使用DateTimeFormatter 对象进行日期格式化
DateTimeFormatter ofPattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.now();
// 增加 168 天后的日期
LocalDateTime time1 = dateTime.plusDays(168);
System.out.println("168天后的日期="+ofPattern.format(time1));
// 减去 168 分钟的时间
LocalDateTime dateTime1 = dateTime.minusMinutes(168);
System.out.println("减去 168 分钟的时间"+ofPattern.format( dateTime1));
七、DateTimeFormat格式日期类
类似于SImpleDateFormat类
/**
* 返回值:
* 2022-08-4 21:08:09
*/
LocalDateTime ldt = LocalDateTime.now();
//日期格式化:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//调用DateTimeFormatter类中的 format方法进行日期格式
String date = dtf.format(ldt);
System.out.println(date);
八、ZoneId
ZoneId.systemDefault() //获取系统默认时区,Asia/Shanghai
九、ZonedDateTime
LocalDateTime总是表示本地日期和时间,要表示一个带时区的日期和时间,就需ZonedDateTime。
可以简单地把ZonedDateTime理解成LocalDateTime加ZoneId。ZoneId是java.time引入的新的时区类
// 默认时区获取当前时间
ZonedDateTime zonedDateTime = ZonedDateTime.now();
// 用指定时区获取当前时间,Asia/Shanghai为上海时区
ZonedDateTime zonedDateTime1 = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
//withZoneSameInstant为转换时区,参数为ZoneId
ZonedDateTime zonedDateTime2 = zonedDateTime.withZoneSameInstant(ZoneId.of("America/New_York"));
API:
getYear()
getMonth()
getDayOfMonth()
getDayOfWeek()
getDayOfYear()
getHour()
getMinute()
getSecond()
getNano()
十一、注解
@JsonFormat:格式化后端传给前端展示的日期
@DateTimeFormat:格式化前端传来的String类型的日期
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date createTime;
十二、时间戳
时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数。通俗的讲, 时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。
十三、Instant
Instant instant = Instant.now(); //这里就是获取了一个本初子午线上的标准时间,2022-08-05T00:31:10.657Z
通过添加时间的偏移量来获取北京时间
OffsetDateTime offsetDateTime=instant.atOffset(ZoneOffset.ofHours(8)); //2022-08-05T08:33:10.636+08:00
获取这个瞬时点对应的时间戳(也就是一个毫秒数)
这个方法是一个非静态方法,使用Instant类的一个实例化对象调用,将这个Instant类转为long类型的数据
从1970年1月1日0时0分0秒到现在的时间差
long l = timestamp.toEpochMilli();
System.out.println(l);
通过给定的毫秒数的得到一个我们的Instant实例
这个方法是一个静态方法,调用这个ofEpochMill()方法传入一个long型的数据,就可以转换成为Instant类的对象
Instant instant = Instant.ofEpochMilli(long variablr);
System.out.println(instant);
——————————————————————————————————————————————————————
异常类
实际应用中的经验总结:
* (1)处理运行时异常时,采用逻辑去合理规避同时辅助 try-catch 处理
* (2)在多重 catch 块后面,可以加一个 catch(Exception) 来处理可能会被遗漏的异常
* 注:catch(Exception)是最大的异常类
* (3)对于不确定的代码,也可以加上 try-catch,处理潜在的异常
* (4)尽量去处理异常,切忌只是简单地调用 printStackTrace() 去打印输出
* (5)具体如何处理异常,要根据不同的业务需求和异常类型去决定
* (6)尽量添加 finally 语句块去释放占用的资源 如:IO 流 ~ Scanner ~
throws与throw的区别
throw 在方法体内使用,throws 函数名后或者参数列表后方法体前
意义 : throw 强调动作,而throws 表示一种倾向、可能但不一定实际发生
throws 后面跟的是异常类,可以一个,可以多个,多个用逗号隔开。throw 后跟的是异常对象。
自定义异常
Exception定义编译时期日常
RuntimeException定义运行时期异常
public class DataExistenceException extends RuntimeException {
public DataExistenceException() {
super();
}
public DataExistenceException(String message) {
super(message);
}
}