目录
java.util.Calendar
(一) 实例化
(二) 类变量
(三) compareTo() after() before() 函数
(四) get() add() set() setTime() 函数
(五) getTime() clear() isSet() 函数
(六) 总结
首页 Java java教程 java时间----java.util.Calendar的详细介绍

java时间----java.util.Calendar的详细介绍

Mar 01, 2017 pm 01:22 PM

java.util.Calendar

在java中时间的类有几个,但是随着Date被渐渐禁用,其中的方法慢慢打上了叉号,剩下能用的函数在Calendar中都已实现,而Calendar的子类GregorianCalendar又过于深入特殊日历的研究,平时我们并不会用到这个子类。我们可以相信Calendar类会是以后的主流时间类,下面我们就一起看一下Calendar类的详细内容,如果有错误欢迎大家指正。

(一) 实例化

Calendar类是一个抽象类,是不能实例化的,那么这个类得到一个日历实例的方法有这么两种:

  Calendar calendar = Calendar.getInstance(TimeZone zone , Locale locale);
登录后复制

通过调用getInstance方法,选择默认的Timezone和Locale属性,从而返回一个日历,也可以在其中加上参数Timezone或Locale从而选择地域地点,具体的参数要去看java.util.Timezone,java.util.Locale这两个包,一般的默认时间是公用的时间我们其实并不需要改动。

除此之外,还有一个能够实例化的方法。没什么稀奇的,java的老套路用子类来实例化。Calendar的子类只有一个——GregorianCalendar,翻译过来就是公历的意思,这个GregorianCalendar我们以后还会单讲。实例化的第二种方式如下:

Calendar calendar = new GregorianCalendar();
登录后复制


(二) 类变量

Calendar中变量基本都用final限定,这些变量将年份,月份,小时,上下午等等所有的时间内容全部包括了。百度上一找一大堆,这种具体要用的时候最好还是看API,我这里姑且简要粘贴一份:

calendar.get(Calendar.YEAR);  
calendar.get(Calendar.MONTH); 
// 月份从0开始 calendar.get(Calendar.DAY_OF_MONTH);   
calendar.get(Calendar.DAY_OF_WEEK);  
calendar.get(Calendar.WEEK_OF_YEAR);  
calendar.get(Calendar.WEEK_OF_MONTH);  
calendar.get(Calendar.HOUR);        
// 12小时calendar.get(Calendar.HOUR_OF_DAY); 
// 24小时 calendar.get(Calendar.MINUTE);  
calendar.get(Calendar.SECOND);  
calendar.get(Calendar.MILLISECOND);
登录后复制

这些值在jdk的源码中都是final变量,既然是int static final修饰,也就是说明这些变量都是有int类型的初始值的。的确如此,Calendar类中为这些变量依次编号,作为一些函数传入参数时的范围判断。那么一不小心有可能会出现这种情况,比如以下代码:

System.out.println(Calendar.DAY_OF_MOUTH);
登录后复制

输出的是5,尽管今天并不是这个月的5号。这其实是一个错误,其实你输出的是这个类中DAY_OF_MOUTH的初始值5,如果你要表示当前月的日期,一定要将类实例出对象,但是在类的变量可以直接点出来的类中,这种错误的发生还是很常见的。正确的方法应该用get()方法来获取(calendar是我们实例的对象):

System.out.println(calendar.get(Calendar.DAY_OF_MOUTH));
登录后复制

(三) compareTo() after() before() 函数

compareTo(Calendar othercalendar),返回int值,如果对象的时间在参数时间之后返回一个大于0的数字,否则返回一个小于0的数字,特别的,如果时间相同返回0,我觉得这个方法的实现可能直接是返回了毫秒数做个差(感觉自己推测好有道理…),毫秒的差值来做返回值。
after(Calendar othercalendar),before(Calendar othercalendar),这两个函数也很好猜测,返回的是boolean值,after()函数如果时间在参数之后返回正值,before()函数时间在参数之前返回正值。

Calendar calendar = Calendar.getInstance();
Calendar calendarother = Calendar.getInstance();
calendarother.add(Calendar.DATE, -20);
if(calendar.after(calendarother))
    System.out.println("after");calendarother.add(Calendar.DATE, 100);if(calendar.before(calendarother))
    System.out.println("before");if(calendar.compareTo(calendarother)>0)
        System.out.println(calendar.getTime()+">"+calendarother.getTime());
登录后复制

输出的结果是:

after 

  before 

  Sun Jan 11 21:19:49 GMT+08:00 1970>Thu Jan 01 00:00:00 GMT+08:00 1970
登录后复制


(四) get() add() set() setTime() 函数

上面的例子中出现了add(int field, int amount)这个函数,这个函数的功能比较强大,可以对第一个参数的值进行加减,从而修改这个日历实体中对应项的数值。

Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, -1);
System.out.println(calendar.getTime());
//输出的日期是当前日期的前一天,其他所有的都不变
登录后复制

get(int field)这个没有什么好说的,把要取得值放进去显示出来,如是而已,顺便提一句getTimeInMillis(),返回毫秒数,实际应用中,这个毫秒数用的还是比较多的。
set()方法有很多组参数输入方式,写的上就看得懂,setTime()这个函数将一个Date对象放进去,返回一个按照Date的日期设置日历。另外特殊需要注意的地方就是,月份是从0开始算的,把月份设置为0实际是一月份,设置为1实际为二月份,一周的第1天是星期日,第7天是星期六。

calendar.get(Calendar.DATE);
calendar.getTimeInMillis();

calendar.set(field, value);
calendar.set(year, month, date);
//月份是从0开始,下同
calendar.set(year, month, date, hourOfDay, minute);
calendar.set(year, month, date, hourOfDay, minute, second);
calendar.setTime(Date date);
//Date对象
登录后复制

(五) getTime() clear() isSet() 函数

getTime()函数是返回一个时间,大概是这个格式的

Sun Jan 11 21:19:49 GMT+08:00 1970

可以用时间格式化的方法来变成自己喜欢的样子,具体看我的另外的博客,这个函数也没有太多的槽点。clear()函数在无参数的情况下是对对象中的所有变量进行清空,清空后的时间直接打回原形,变为

Thu Jan 01 00:00:00 GMT+08:00 1970

clear()也可以附带上参数int field,表示单单清除这个数值:

calendar.clear(Calendar.YEAR);System.out.println(calendar.getTime());
登录后复制

上述代码最后显示的年份是1970年(不可能清除成0000年…),其他的也可以以此类推。
isSet()方法确定日历字段是否已经设置了一个值,有些值会因为get方法触发计算而被设置,很多的时候,只要进行了初始化,很多值已经被设置了,但是作为一个boolean返回值的函数,检测的时候我们相信还是会起到作用的。

if(calendar.isSet(Calendar.DATE))
登录后复制

(六) 总结

Calendar类正如其名,可以实现一个日历,对其进行操作且功能较为完整。如果你只是需要一个时间,这个类并不一定比new Date()能快多少,但是对于一些细节的操作,还是有很多值得我们学习的地方。

 以上就是java时间----java.util.Calendar的详细介绍的内容,更多相关内容请关注PHP中文网(www.php.cn)!


本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Java 中的平方根 Java 中的平方根 Aug 30, 2024 pm 04:26 PM

Java 中的平方根指南。下面我们分别通过例子和代码实现来讨论平方根在Java中的工作原理。

Java 中的完美数 Java 中的完美数 Aug 30, 2024 pm 04:28 PM

Java 完美数指南。这里我们讨论定义,如何在 Java 中检查完美数?,示例和代码实现。

Java 中的随机数生成器 Java 中的随机数生成器 Aug 30, 2024 pm 04:27 PM

Java 随机数生成器指南。在这里,我们通过示例讨论 Java 中的函数,并通过示例讨论两个不同的生成器。

Java中的Weka Java中的Weka Aug 30, 2024 pm 04:28 PM

Java 版 Weka 指南。这里我们通过示例讨论简介、如何使用weka java、平台类型和优点。

Java 中的阿姆斯特朗数 Java 中的阿姆斯特朗数 Aug 30, 2024 pm 04:26 PM

Java 中的阿姆斯特朗数指南。这里我们讨论一下java中阿姆斯特朗数的介绍以及一些代码。

Java 中的史密斯数 Java 中的史密斯数 Aug 30, 2024 pm 04:28 PM

Java 史密斯数指南。这里我们讨论定义,如何在Java中检查史密斯号?带有代码实现的示例。

Java Spring 面试题 Java Spring 面试题 Aug 30, 2024 pm 04:29 PM

在本文中,我们保留了最常被问到的 Java Spring 面试问题及其详细答案。这样你就可以顺利通过面试。

突破或从Java 8流返回? 突破或从Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一种强大且表达力丰富的处理数据集合的方式。然而,使用Stream时,一个常见问题是:如何从forEach操作中中断或返回? 传统循环允许提前中断或返回,但Stream的forEach方法并不直接支持这种方式。本文将解释原因,并探讨在Stream处理系统中实现提前终止的替代方法。 延伸阅读: Java Stream API改进 理解Stream forEach forEach方法是一个终端操作,它对Stream中的每个元素执行一个操作。它的设计意图是处

See all articles