JDK7的日期时间类。
Date类
Date类表示时间,时间可以精确到毫秒。创建一个Date对象,其实就表示时间的对象。
Date date1=new Date(); //当前系统时间
Date date2=new Date(0L); //1970年1月1日8点0时0分 (中国)
Date date3=new Date(1000L*60*60*24); //1970年1月2日8点0时0分 (中国)
获取和设置时间
Date date=new Date(); //当前系统时间
//设置时间为
date.setTime(1000L*60*60*24); //1970年1月2日8点0时0分 (中国)
//获取时间
long time=date.getTime(); //1000L*60*60*24
System.out.println(time); //毫秒值
SimpleDateFormat类
SimpleDateFormat类可以对日期进行格式化和解析的操作。
SimpleDateFormat在进行日期格式化或者解释时,需要识别一些特定符号
yyyy: 年 1999年
MM: 年中的月 8月
dd: 月中的天 28日
HH: 天中的小时 16时
mm: 时中的分 20分
ss: 分中的秒 18秒
SS: 毫秒
//在进行日期格式化和解析之前,必须使用以上的符号创建SimpleDateFormat对象,来指定日期或者时间的格式
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
- 下面是格式化和解析的代码
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
//1.日期格式化:Date对象-->String
String str=sdf.format(new Date()); //把当前时间格式化为字符串
//2.日期解析:String --> Date对象
Date date=sdf.prase("1992年08月09日 16时24分18秒");
- 练习:键盘录入一个生日(格式:yyyy-MM-dd),计算当前的年龄是多少?
//键盘录入字符串生日
Scanner sc=new Scanner(System.in);
System.out.println("请输入你的生日(格式:yyyy-MM-dd):");
String birthday=sc.nextLine():
//把生日的字符串,转换为Date
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Date date1=sdf.prase(birthday); //生日那天的Date对象
long time1=date1.getTime(); //生日那天的毫秒值
//获取当前时间的毫秒值
long time2=System.currentTimeMills(); //当前时间的毫秒值
//计算时间差
long age=(time2-time1)/1000/60/60/24/365;
System.out.println("年龄为:"+age);
JDK8新增的日期类
LocalDateTime获取对象
LocalDateTime类 可以表示时间的(年、月、日、时、分、秒)
public static LocalDateTime now()
获取当前的系统时间LocalDateTime对象
public static LocalDateTime of(int y,int m,int d,int h,int m,int s)
获取指定时间的LocalDateTime对象
LocalDateTime的获取方法
public int getYear()
获取年
public int getMonthValue()
获取月
public int getDayOfMonth()
获取月中的天
public int getDayOfYear()
获取年中的天
public DayOfWeek getDayOfWeek()
获取星期中的第几天
public int getHour()
获取小时
public int getMinute()
获取分钟
public int getSecond()
获取秒
LocalDateTime的转换方法
三者的区别
LocalDateTime: 包含年、月、日、时、分、秒
LocalDate: 包含年、月、日
LocalTime: 包含时、分、秒
可以通过LocalDateTime转换为LocalDate和LocalTime
public LocalDate toLocalDate()
把LocalDateTime转换为LocalDate
public LocalTime toLocalTime()
把LocalDateTime转换为LocalTime
LocalDateTime的格式化和解析
public String format(DateTimeFormatter formatter)
格式化:把LocalDateTime转换为String
static LocalDateTime parse(CharSequence text, DateTimeFormatter formatter)
解析:把字符串转换为LocalDateTime对象
- 日期格式化代码演示
//获取当前时间的LocalDateTime对象
LocalDateTime localDateTime = LocalDateTime.now();
//创建日期格式化器
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//格式化
String str=localDateTime.format(formatter);
System.out.println(str);
- 日期解析的代码演示
//创建日期格式化器
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//日期解析
LocalDateTime localDateTime= LocalDateTime.parse("2020-08-23 15:19:39",formatter);
//...后面就可以使用LocalDateTime的方法,对时间进行操作
LocalDateTime加减运算方法
public LocalDateTime plusYears(int n)
加、减年
public LocalDateTime plusMonths(int n)
加、减月
public LocalDateTime plusDays(int n)
加、减日
public LocalDateTime plusHours(int n)
加、减时
public LocalDateTime plusMinutes(int n)
加、减分
public LocalDateTime plusSeconds(int n)
加、减秒
LocalDateTime设置时间的方法
public LocalDateTime withYear(int n)
设置年
public LocalDateTime withMonth(int n)
设置月
public LocalDateTime withDay(int n)
设置日
public LocalDateTime withHour(int n)
设置时
public LocalDateTime withMinute(int n)
设置分
public LocalDateTime withSecond(int n)
设置秒
时间间隔类
Period类
计算两个时间间隔的年、月、日。
//生日的时间
LocalDate localDate1 = LocalDate.of(1996, 6, 23);
//今天的时间
LocalDate localDate2 = LocalDate.now();
//获取时间间隔对象
Period period = Period.between(localDate1,localDate2);
//获取相隔的年
int years = period.getYears();
System.out.println(years);
...
Duration类
计算两个时间间隔的时、分、秒
//生日的时间
LocalDateTime localDate1 = LocalDateTime.of(1996, 6, 23,13,34,22);
//今天的时间
LocalDateTime localDate2 = LocalDateTime.of(1996, 7, 13,06,34,11);
//获取时间间隔对象
Duration duration = Duration.between(localDate1,localDate2);
//获取相隔的小时
long years = duration.toHours();
//获取相隔的分钟
long minutes = duration.toMinutes();
//获取相隔的秒
long seconds = duration.toSeconds();
//相隔的毫秒
long millis = duration.toMillis();
异常
异常其实就是程序在编译和运行时期的一些不正常的异常。 Java的工程师们,把一些常见的问题都封装了异常类 ,在API中给你列举出来了。当我们使用Java语言写代码的时候,可能会出现这些问题,当出现这些问题的时候,就可以去API中找,哪里出现了问题。
异常类的继承体系
Throwable 是所有异常和错误的根类
Error: 错误,不能解决的问题。
Exception: 异常,可以解决的问题。
RuntimeException: 运行时异常,在运行时才出现问题
非RuntimeException:编译时异常,编译时有问题。
异常的处理
- 虚拟机自己处理
直接停止程序运行,然后把异常信息打印在控制台
- try…catch手动处理
try{
//检查代码中是否有异常
}catch(异常类 e){
//如果try中有异常,就会被catch捕获到
}
好处:处理之后的代码还可以继续执行
- throws 声明异常
throws用在方法上,用来声明一个方法它可能会有异常
//如果一个方法后面有throws声明异常,那么调用方法的时候就需要处理异常。
public static void method(String str) throws ParseException {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse(str);
System.out.println(date);
}
Throwable的方法
public String getMessage()
获取异常信息
public String toString()
返回异常类名+异常信息
public void printStackTrace()
打印详细的异常信息
throw 产生一个异常
如果你是写API的人,在写方法的时候,会考虑到方法的调用者传递非法的参数。你必须先对这些参数左一些合法性的校验,如果不通过,告诉调用者一个异常。
public static void main(String[] args) {
sale(7);
}
public static void sale(int money){
if(money==5||money==10){
System.out.println("钱是真的,可以正常买东西");
}else{
throw new RuntimeException("钱是假的,我报警了,等着!!!");
}
}
自定义异常
如果在写一个方法的时候,API中提供的异常类,还不足以说明程序的问题。你就可以自己定义一个异常类
自定义异常类的步骤:
1.写一个类继承Exception或者RuntimeException
2.自动生成两个构造方法
注意:自定义异常,名称一定要见名知意(最好是能够使用异常类的名称,来说明问题)