时间类Date和Calendar

在Java中和时间相关的类有很多,就像计算机中的时间一样换了很多次
Date类,逐渐淘汰
Calendar类
LocalDate类…………
这么多类,要怎么学好呢?假如我就是想在程序中使用时间,最简单的输出现在的年月日时间,输出一个自己输入的时间,再进阶一点打印一个日历,那Calendar类和Date类基本可以满足需求了。下面我们来试一试吧~

进入学习之前,普及一下格林尼治时间(GTM)和世界标准时间(UTM)、计算机时间、时区的概念

格林尼治时间:在翻译上,格林尼治时间==格林威治时间。我们知道,太阳东升西落,有一个什么0度经线,那里有个格林尼治天文台,第一缕阳光就从那里开始照射,然后开始新的一天,按照格林尼治天文台的测算的时间就叫做格林尼治时间。
世界标准时间:由于科技发展人类可以更加精确地计算时间,于是有了UTM时间。
计算机时间:约翰逊,UNIX之父,在1971年创造了UNIX操作系统(Eniac诞生在1948)。在UNIX中由于要使用到时间,又为了纪念UNIX诞生,于是将1971.1.1.00:00设为UNIX时间元年。当时的计算机是32位的,我们知道int也是32位的,用来记录时间太短了,不够用,每过一段时间就要将元年向后重置。随着后来计算机的发展,64位计算机出现了,为了方便记忆,计算机时间元年设置为1970.1.1.00:00。
时区:我们的地球是会自转的,我们现在北京时间12点是格林威治那边的4点,相差了8个小时。那边人们还在睡觉。想象一下,地球一面是黑夜,一面是白昼。地球是匀速自转的,我们把地球360度分为24个时区,每个时区地球要走1小时。

下面我们来看看Date类和Calendar类怎么使用吧!
创建Date类对象

Date date = new Date();

注意:在Java中,创建一个类的对象使用new关键字,就算在使用的时候没有使用new+构造方法来创建对象,但本质上该方法中还是调用了new+构造方法的形式来创建对象。所以在Java中,如果我们需要得到一个类的对象,我们可以使用new+关键字,也可以使用代理方法帮我们new一个对象,还可以使用一些类中已经new好的对象,这些对象在类中一般是static静态变量。

这时我们使用System.out.println();来打印输出一下这个date

System.out.println(date);

输出结果:Mon Dec 13 15:56:13 CST 2021
注意:我们打印在屏幕上的都是字符串,所以date会自动调用toString()方法,toString()方法是所有类的父类Object类的方法,如果没有重写该方法,打印一个对象就会输出对象名@地址,String类中重写了toString()方法。所以这里的Date类也重写了toString()方法,可以右键Date,IDEA会跳转到Date类的代码,使用Ctrl+F搜索toString可以看到Date类重写了toString()方法。

到这里,我们已经实现了使用Date类打印当前时间了,当然这里的时间格式使用的是Date类中的toString()方法规定的,也不是不能看,后面我们再来看看如何修改这个时间格式。可以发现,使用构造方法Date()创建的对象就是当前时间。我们可以在Date()方法中看到它调用了Date(long time)这个构造方法,并且形式参数传入的值为System.currentTimeMillis(),这个System.currentTimeMillis()是计算机时间1970.1.1.00:00到当前的秒数,是个很大的数。

既然我们可以使用Date类创建一个当前时间的对象,现在我们使用Date类创建一个指定时间的对象。在华为日历中有一个功能叫做跳转到指定日期,在知道这个功能之前,要找到之前或者之后的日期我都是一天一天找,太麻烦了。

Date date1 = new Date(2008,9,1);

输出结果:Tue Oct 01 00:00:00 CST 3912
什么?3912,右键方法跳转到Date类中的Date(int year, int month, int date)方法,方法介绍说这里开始年份是1900年,月份从0-11,天数从1-31,所以本来我要输入的2008年9月1日,给我输出的是3912年10月1日,有点不直观了。这里的时间对象可以精确到秒,上面我们没有指定精确到秒它就默认是0时0分0秒了。

上面我们使用能使用Date类创建一个当前时间对象和指定时间对象,之后我们来试试Calendar如何实现这些功能的。
创建一个Calendar类对象
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime());

输出结果:Thu Jan 01 08:00:00 CST 1970

这里打印的是计算机元年时间1970.1.1.00:00的北京时间,为什么打印这个时间呢?getInstance()方法其实是调用了createCalendar(TimeZone zone,Locale aLocale)方法,于是打印的时间和我们的本地时区有关。这里我们就是使用到其他方法来帮我们创建calendar对象。
注意:Calendar类中是没有重写toString()方法的

getInstance()方法中也不能加System.currentTimeMillis()这样的参数,获取当前时间的calendar对象只能找别的方法了。

calendar.setTimeInMillis(System.currentTimeMillis());

输出结果:Mon Dec 13 16:59:43 CST 2021

下面是使用Calendar对象跳转到指定时间,(Date类也有set方法)

calendar.set(2018,9,1,20,00,00);

输出结果:Mon Oct 01 20:00:00 CST 2018

注意:Calendar类中的月是0-11,其他的还好。这个对象的时间精确到秒。

至于打印日历只有以后来填坑了。。。

posted on 2021-12-13 17:24  小白成长变大神  阅读(320)  评论(0编辑  收藏  举报