这日子呀真是过完一天就会少一天,那我们一生到底有多少个日子呢?如果不清楚,那么就让我们来了解一下__Java__当中的__时间、日期类__吧日期时间类在Java开发中得到了广泛的应用,今天有我这个帅气又迷人的大帅锅“thadqy”来给大家讲一讲这个时间、日期类吧!
Java给我们提供了Date类来处理时间以及日期。大家要注意哦,这儿的Date类是在__java.util包下__,而不是__java.sql包下的Date类__。
Date类给我们提供了六个构造器。不过,Java官方已经不再推荐其中的4个;如果使用不再推荐的构造器编译器会发出警告,还会影响程序性能和安全方面等。下面是仅剩的两个构造器:
Date() :改构造器代表生成当前时间的Date对象。并且,再底层调用了System.currentTimeMillis()以获得Long类型的日期参数
Date date1 = new Date(); System.out.println(date1); //Fri Jul 03 16:53:55 CST 2020Date(long date) :根据指定的long类型整数生成Date对象。构造器参数表示创建的Date对象与GMT1970年1月1日00:00:00之间的时间差,以毫秒作为计时单位
Date date2 = new Date(56354646); System.out.println(date2); //Thu Jan 01 23:39:14 CST 1970与Date类的构造器一样,它的方法大部分也已经过时。下面就是位数的几个方法:
boolean after(Date when) :测试该日期是否在指定日期when之后
Date date3 = new Date(System.currentTimeMillis() + 10); Date date4 = new Date(); System.out.println(date3.after(date4)); //trueboolean before(Date when) :测试改日期是否在指定日期when之前
Date date1 = new Date(); Date date3 = new Date(System.currentTimeMillis() + 10); System.out.println(date1.before(date3)); //truelong getTime() :返回改时间与GMT 1970年1月1日00:00:00之间的时间差,返回long类型的以毫秒为单位的时间
Date date = new Date(); long timeMillis = date.getTime(); System.out.println(timeMillis + " ms"); //1593767166696 msvoid setTime(long time) :设置改Date对象时间
Date date = new Date(); long timeMillis = date.getTime(); Date date5 = new Date(); date5.setTime(timeMillis); System.out.println(date5); //Fri Jul 03 17:16:16 CST 2020总的来说,Java提供的Date类是一个对操作时间、日期并不高效、方便的类。因此Java官方并不推荐使用Date类。但是,如果你需要对时间、日期进行加减运算,获取指定的年、月、日、时、分、秒等信息应该怎么办呢?
不要慌张!!!,考虑到Date类的糟糕设计,又出现了Calendar工具类。我们可以使用Calendar类来完成一些Date类完不成的任务。
Calendar本身是一个抽象类,它是所有的日历类的模板,并提供一些所有日历通用的方法。Java给我们提供了一个Calendar的子类Gregorian Calendar类,他就是我们通常所说的公历。
因为Calendar是一个抽像类,所有Calendar不能用构造器来创建。但是Calendar提供了几个静态方法来获取Calendar类。如,getInstance()。
Calendar与Date都是用来表示时间日期的工具类。所以,Calendar与Date类是可以自由转换的。如下所示:
//创建Calendar对象 Calendar calendar = Calendar.getInstance(); //从Calendar对象中取出Date对象 Date date = calendat.getTime(); //通过Date获取Calendat对象,因为Calendar类没有构造函数可以接受Date对象,所以必须先获取Calendar实例,然后再通过setTime()方法 Calendar calendar2 = Calendar.getInstance(); calendar2.setTime(date);void add(int field, int amount) :为给定的日历字段添加或减去指定的时间量
//给当前日期减去5天 Calendar calendar = Calendar.getInstance(); System.out.println("当前日期为:" + calendar.getTime()); //减去5天 calendar.add(calendar.DAY_OF_MONTH, -5); System.out.pringln("当前日期减去5天为:" + calendar.getTime()); //当前日期为:Fri Jul 03 17:57:44 CST 2020 //当前日期减去5天为:Sun Jun 28 17:57:44 CST 2020void roll(int field, int amount) :与add()方法类是,但是有一点不同,就是roll再amount后如果超过最大值,也不会向上一位进位
Calendar calendar = Calendar.getInstance(); calendar.set(2020, 7, 3, 18, 13, 25); System.out.println(calendar.getTime()); calendar.roll(calendar.MONTH, 6); System.out.println(calendar.getTime()); //Mon Aug 03 18:13:25 CST 2020 //Mon Feb 03 18:13:25 CST 2020+int getActualMaximum(int field) :返回指定日历字段的最大值。例如月,最大值为11
int maxMonth = calendar.getActualMaximum(calendar.MONTH); System.out.println("月份最大为:" + maxMonth); //月份最大为:11int getActualMinimum(int field) :返回指定日历字段的最小值。例如,月,最小值为0
int miniMonth = calendar.getAtualMinimum(calendar.MONTH); System.out.println("月份最小为:" + miniMonth); //0int get(int field) :返回指定日历字段的值
Calendar c = Calendar.getInstance(); int day = c.get(c.DAY_OF_MONTH); System.out.println("当前为"+day+"日"); //当前为3日void set(int field, int value) :将给定的日历字段设置为给定的值
Calendar c1 = Calendar.getInstance(); c1.set(c1.MONTH, 11); System.out.println(c1.get(c1.MONTH)); //11void set(int field, int month, int date) : 设置Calendar对象的年月日
Calendar c12 = Calendar.getInstance(); c12.set(2000, 7, 20); System.out.println(c12.getTime()); //Sun Aug 20 22:10:36 CST 2000void set(int field, int month, int date, int hourofDay, int minute, int second) :设置Calendar对象的年月日时分秒
Calendar c = Calendar.getInstance(); c.set(2000, 8, 20, 7, 25, 0); System.out.println(c.getTime()); //Wed Sep 20 07:25:00 CST 2000Calendar类的set()方法在修改时具有延迟效果。这主要是因为:Calendar在修改字段时并没有立即修改,而是使用成员变量表将修改值记录下来。因此,Calendar类在修改时并未进行真实值的计算。下面举一个简单的例子:
public class LazyTest{ public static void main(String[] args){ Calendar cal = Calendar.getInstance(); cal.set(2000, 7, 31); // 2000年8月31日 //将月份修改为9月 //如果立即修改,系统将会自动把cal调为10月1日 cal.set(cal.MONTH, 8); System.out.println(cal.getTime()); // ① //设置DATE字段为5 cal.set(cal.DATE, 5); // ② System.out.println(cal.getTime()); // ③ } } 在上面的代码中我们运行后得到输出结果为: Sun Oct 01 22:32:06 CST 2000 __Thu Oct 05 22:32:06 CST 2000__ 但是,当我们将第①行的代码注释掉后,我们在运行,就会发现得出的结果为: __Tue Sep 05 22:38:45 CST 2000__ 在这儿我们明显看到,结果是不一样的,这就是Calendar类的set()方法修改延迟带来的后果在Java 8以后有新增了一个日期、时间包。这个包的出现又给我们操作日期、时间数据提供了遍历。那么接下来,就继续来看看这个__java.time包__下有什么神奇的方面。
java.time包包含了几个常用的类。下面就来看看这类吧。
这是一个枚举类,定义了周日到周六的枚举值
下面就用一个简单的程序来示范这些用法
今天关于Java的日期、时间类的介绍就到这里啦!多谢客官的支持。本人学识有限,万望大家海涵。同时对于文中有误之处,也希望大家之处。