三代日期类的基本使用
一、第一代日期类Date
Date 日期类是在java.util 包中的。
Date日期类 调用它的无参构造器 返回当前系统的时间 如下:
Date date = new Date(); //返回当前系统的时间 具体格式 是国外的格式
System.out.println(date);//输出如下
Sun Jul 10 23:31:16 CST 2022
还有与Date类 配套使用的格式转换类 SimpleDateFormat类 该类可以格式化日期 转化成一个字符串的格式。 在指定格式时所使用的字母有具体的规定,可在JDK API 中查找,如图。
Date date = new Date(); //返回当前系统的时间 具体格式 时国外的格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 kk:mm:ss E");
String format = sdf.format(date); //将日期转换成指定格式的字符串
System.out.println(format);//输出如下
2022年07月10日 23:35:33 星期日
在SimpleDateFormat类中 还提供了将字符串 转化为Date日期的方法
//SimpleDateformat 类中还有方法可以将一个字符串转化成一个Data日期
//当格式 必须是new SimpleDateformat 时的格式否则会由抛出转化异常
String s = "2000年12月29日 23:13:49 星期二"; //这里字符串的格式必须要是自己设定的格式
Date parse = sdf.parse(s); //这里会 产生ParseException的编译异常可以捕获 或是抛出异常
System.out.println(sdf.format(parse));//转化后的Data默认为的时间还是国外,可以进行格式化
//输入如下
2000年12月29日 23:13:49 星期五
二、第二代的日期类Calendar
Calendar日期类时一个抽象类,它的构造器protected意味着我们不能通过 new 获得一个Calendar对象,所以我们想要获得一个Calendar具体如下:
Calendar instance = Calendar.getInstance();//因为Calendar的构造器是protected 我们无法去new
//获得对象 所以Calendar类中提供了方法 去获得它的一个实例
System.out.println(instance);//输出发现并没有获得当前用户的时间 而是这个实例的引用.
Calenadar 通过特定的常量字段 来获取特定瞬间的时间.
//因为Calendar类中没有 格式化的类只有靠自身定义的常量字段 手动去格式化时间 比较的灵活
System.out.println(instance.get(Calendar.YEAR) + "年");
System.out.println(instance.get(Calendar.MONTH) + 1 + "月");//月份从0开始记数所以要加1
System.out.println(instance.get(Calendar.DAY_OF_MONTH) + "日");
System.out.println(instance.get(Calendar.HOUR_OF_DAY) + "时");
System.out.println(instance.get(Calendar.MINUTE) + "分");
System.out.println(instance.get(Calendar.SECOND) + "秒");
//输出如下
2022年
7月
11日
0时
25分
42秒
具体格式标准可以通过字符串的拼接来表示.
二、第三代的日期类LocalDateTime
因为Date,Calendar日期类有着各种的不足,在 jdk8 加入了第三代日期类LocalDateTime
LocalDateTime类中的构造器是 private 意味着也无法通过new 获得日期对象,所以其提供了
now()方法 返回当前用户日期对象.
LocalDateTime now = LocalDateTime.now();//构造器为private 通过方法获得时间对象
System.out.println(now);//输出如下
2022-07-11T01:00:33.297
LocalDateTime有一个 配对的格式化类 DateTimeFormatter
//第三代日期有格式化类DateTimeFormatter 通过方法返回格式化对象
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss E");
System.out.println(dtf.format(now));//格式化输出如下
2022-07-11 01:02:26 星期一
注意:格式化中字符串中的字符是规定的, 可在Jdk APi(1.8或以后的版本) 中的 DateTimeFormatter中查看。
LocalDateTime中也有方法 可以获得单个具体的时间
//第三代日期类中可以通过getXxx()方法 获取具体的时间段
System.out.println(now.getYear());//年
System.out.println(now.getMonth());//月
System.out.println(now.getDayOfMonth());//日
System.out.println(now.getHour());//时
System.out.println(now.getMinute());//分
System.out.println(now.getSecond());//秒
在LocalDateTime中还可以 获取现在时间加上或减去一段时间后的时间
//LocalDateTime 通过plusXxx() 或是minusXxx()
//以现在用户的时间 加上/减去 一段时间后的时间
System.out.println("30天后: " + dtf.format(now.plusDays(30)));//30天后
System.out.println("16月前: " + dtf.format(now.minusMonths(16)));// 16月前
//输出如下
30天后: 2022-08-10 01:11:15 星期三
16月前: 2021-03-11 01:11:15 星期四
第三代日期类中还有许多实用的方法,具体使用可自行探索.
总结
在Date 的大多数方法 在JDK1.1 引入后Calendar 就被弃用了其本身也存在在一些问题如线程不安全,没有格式化等。现如今Date也使用得很少,如需获取时间,最好使用第三代日期类LocalDateTime获取。