巧用Java中Calendar工具类
Java的JDK中提供了一系列好用的util工具类。Calendar就是java.util中用于处理日期的工具类。且该工具类易学易用实用。
工具类Calendar是抽象类。
PS:为什么把Calendar定义成抽象类呢?很简单,仔细想想就会知道:全世界有很多种计量日期的方式,所以要把Calendar定义成一个抽象类,日本有日历计量方式;而中国就有阳历阴历之说。
抽象类是不能New的,所以,通常我们会通过Calendar的子类来操作日期。我们通过 Calendar .getInstance()方法,能够拿到具体的日历子类实现。Calendar.getInstance()的源代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | public static Calendar getInstance() { Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT)); cal.sharedZone = true ; return cal; } private static Calendar createCalendar(TimeZone zone, Locale aLocale) { Calendar cal = null ; String caltype = aLocale.getUnicodeLocaleType( "ca" ); if (caltype == null ) { // Calendar type is not specified. // If the specified locale is a Thai locale, // returns a BuddhistCalendar instance. if ( "th" .equals(aLocale.getLanguage()) && ( "TH" .equals(aLocale.getCountry()))) { cal = new BuddhistCalendar(zone, aLocale); } else { cal = new GregorianCalendar(zone, aLocale); } } else if (caltype.equals( "japanese" )) { cal = new JapaneseImperialCalendar(zone, aLocale); } else if (caltype.equals( "buddhist" )) { cal = new BuddhistCalendar(zone, aLocale); } else { // Unsupported calendar type. // Use Gregorian calendar as a fallback. cal = new GregorianCalendar(zone, aLocale); } return cal; } |
那么Calendar.getInstance()这个方法都做了哪些事情呢?虽然方法被命名为getInstance(),但是它并不能说明Calendar是一个单例的。通过上面源代码我们就能略知一二。该方法,主要就是通过你所在的时区、日历格式,以及当前时间,确定这一时刻的Calendar对象。
PS:为什么Calendar不使用单例实现呢?很简单,仔细想一想,单例返回的永远都是一个对象,即对象的引用是相同的。故C1和C2两个日历对象,你改变了C1,那么C2自动改变显然不是你想要的。
Calendar工具类的使用很简单,但是JDK文档里面说的太过于繁琐了。所以我根据网上的一些资料,整理了一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | public static void main(String[] args) { // Calendar的子类 // GregorianCalendar Calendar calendar = Calendar.getInstance(); calendar.setTime( new Date()); // 设置日期为2011-07-24 09:59:50 calendar.set( 2011 , 06 , 24 , 9 , 59 , 50 ); // 12小时制 int temp12Hour = Calendar.HOUR; // 24小时制 int temp24Hour = calendar.HOUR_OF_DAY; // 显示年份 int yearIndex = Calendar.YEAR; int year = calendar.get(yearIndex); System.out.println( "yearIndex=" + yearIndex); System.out.println( "year=" + year); // 显示月份 (从0开始, 实际显示要加一) int monthIndex = Calendar.MONTH; int month = calendar.get(monthIndex) + 1 ; System.out.println( "monthIndex=" + monthIndex); System.out.println( "month=" + month); // 今年的第几天 int dayOfYearIndex = Calendar.DAY_OF_YEAR; int dayOfYear = calendar.get(dayOfYearIndex); System.out.println( "dayOfYearIndex=" + dayOfYearIndex); System.out.println( "dayOfYear=" + dayOfYear); // 本月的第N天 int dayOfMonthIndex = Calendar.DAY_OF_MONTH; int dayOfMonth = calendar.get(dayOfMonthIndex); System.out.println( "dayOfMonthIndex=" + dayOfMonthIndex); System.out.println( "dayOfMonth=" + dayOfMonth); // 本周第N天,从周日开始 int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1 ; if (dayOfWeek == 0 ) { dayOfWeek = 7 ; } System.out.println( "dayOfWeek=" + dayOfWeek); // 三小时以后 int hourOfDayIndex = Calendar.HOUR_OF_DAY; calendar.add(hourOfDayIndex, 3 ); int afterThreeHour = calendar.get(hourOfDayIndex); System.out.println( "afterThreeHour=" + afterThreeHour); // 当前分钟数 int minuteIndex = Calendar.MINUTE; int minute = calendar.get(minuteIndex); System.out.println( "minuteIndex=" + minuteIndex); System.out.println( "minute=" + minute); // 15分钟以后 calendar.add(minuteIndex, 15 ); minute = calendar.get(minuteIndex); System.out.println( "minute+15=" + minute); // 30分钟以前 calendar.add(minuteIndex, - 30 ); minute = calendar.get(minuteIndex); System.out.println( "minute-30=" + minute); // 格式化显示 SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss:SS" ); String time = sdf.format(calendar.getTime()); System.out.println(time); // 重置Calendar显示当前时间 calendar.setTime( new Date()); time = sdf.format(calendar.getTime()); System.out.println(time); // 创建一个Calendar 用于比较时间 Calendar calendarNew = Calendar.getInstance(); // 设定为5小时以前,后者大,显示-1 calendarNew.add(Calendar.HOUR, - 5 ); System.out.println( "时间比较:" + calendarNew.compareTo(calendar)); // 设定7小时以后,前者大 ,显示1 calendarNew.add(Calendar.HOUR, + 7 ); System.out.println( "时间比较:" + calendarNew.compareTo(calendar)); // 退回2小时,时间相同,显示0 calendarNew.add(Calendar.HOUR, - 2 ); System.out.println( "时间比较:" + calendarNew.compareTo(calendar)); // 创建两个日历对象 Calendar cal = Calendar.getInstance(); Calendar future = Calendar.getInstance(); // 打印当前日期 System.out.println( "Current date: " + cal.getTime()); // 改变年份 future.set(Calendar.YEAR, 2066 ); System.out.println( "Year is " + future.get(Calendar.YEAR)); // 检查日期是否在当前日期之后 if (future.after(cal)) { System.out.println( "Date " + future.getTime() + " is after current date." ); } } |
日期操作,是Java编程中很重要的一部分,同时,它的简单易用更加让你青睐它。使用Calendar基本上能够帮助我们顺利完成百分之九十九点九九的工作。Calendar,你会了吗?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异