Java日期計算(Calendar類)
主要學習的日期操作主要是-----獲取日期字段(年、月、日、年中的天數、年中的周數等)、計算兩個時間的間隔日期(年、月、天)、根據開始時間間隔時間計算結束時間。
關于Calendar日歷的字段值,我從JDK中摘抄了一些我認為比較重要的,如下:
常規的年月日時分秒:
static int YEAR
指示年的 get 和 set 的字段數字。
static int MONTH
指示月份的 get 和 set 的字段數字。
static int DATE
get 和 set 的字段數字,指示一個月中的某天。
static int HOUR
get 和 set 的字段數字,指示上午或下午的小時。
static int MINUTE
get 和 set 的字段數字,指示一小時中的分鐘
static int SECOND
get 和 set 的字段數字,指示一分鐘中的秒。
比較有用的幾個字段:
static int DAY_OF_YEAR
get 和 set 的字段數字,指示當前年中的天數。
static int WEEK_OF_YEAR
get 和 set 的字段數字,指示當前年中的星期數。
static int WEEK_OF_MONTH
get 和 set 的字段數字,指示當前月中的星期數。
static int DAY_OF_WEEK
get 和 set 的字段數字,指示一個星期中的某天。
下面是關于日期計算的測試代碼,雖然較長,但是調理很清晰。
/** * 日期類Date、Calendar測試類 * */ package com.date_test; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * @author wkupaochuan * @time Jun 14, 2012 * @version V 1.0 * * 實現的接口如下: * 1---根據開始時間和間隔天數計算結束時間 Date calculateEndDate(Date sDate, int days) * 2---根據開始時間、結束時間、間隔類型(年、月、日)計算間隔時間 int calInterval(Date sDate, Date eDate, String type) * 3---輸出日歷實例(當前時間)的各個字段值 void printFields(Calendar cNow) * 4---判定某個年份是否是閏年 boolean isLeapYear(int year) * 5---比較兩個日期的大小 int compareDate(Date sDate, Date eDate) */ public class Calendar_test { public static void main(String agrs[]) { //獲取日歷實例并賦予當前時間 Calendar cNow = Calendar.getInstance(); cNow.setTime(new Date()); //輸出日歷相關字段 printFields(cNow); /*計算兩個日期的時間間隔*/ //開始時間 Date sDate = new Date(); //結束時間 try { Date eDate = (new SimpleDateFormat("yyyy-MM-dd")).parse("2012-05-29"); //計算結果并輸出 System.out.println("今天與2020-05-29相隔:" + calInterval(sDate, eDate, "d") + "天"); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } /*計算結束日期并輸出*/ SimpleDateFormat df = (SimpleDateFormat)DateFormat.getInstance(); df.applyPattern("yyyy-MM-dd"); System.out.println("從幾天開始計算,2天后是:" + df.format(calculateEndDate(sDate, 2))); } /** * 根據起始日期和間隔時間計算結束日期 * * @param sDate開始時間 * * @param days間隔時間 * * @return 結束時間 * */ public static Date calculateEndDate(Date sDate, int days) { //將開始時間賦給日歷實例 Calendar sCalendar = Calendar.getInstance(); sCalendar.setTime(sDate); //計算結束時間 sCalendar.add(Calendar.DATE, days); //返回Date類型結束時間 return sCalendar.getTime(); } /** * 計算兩個日期的時間間隔 * * @param sDate開始時間 * * @param eDate結束時間 * * @param type間隔類型("Y/y"--年 "M/m"--月 "D/d"--日) * * @return interval時間間隔 * */ private static int calInterval(Date sDate, Date eDate, String type) { //時間間隔,初始為0 int interval = 0; /*比較兩個日期的大小,如果開始日期更大,則交換兩個日期*/ //標志兩個日期是否交換過 boolean reversed = false; if(compareDate(sDate, eDate) > 0) { Date dTest = sDate; sDate = eDate; eDate = dTest; //修改交換標志 reversed = true; } /*將兩個日期賦給日歷實例,并獲取年、月、日相關字段值*/ Calendar sCalendar = Calendar.getInstance(); sCalendar.setTime(sDate); int sYears = sCalendar.get(Calendar.YEAR); int sMonths = sCalendar.get(Calendar.MONTH); int sDays = sCalendar.get(Calendar.DAY_OF_YEAR); Calendar eCalendar = Calendar.getInstance(); eCalendar.setTime(eDate); int eYears = eCalendar.get(Calendar.YEAR); int eMonths = eCalendar.get(Calendar.MONTH); int eDays = eCalendar.get(Calendar.DAY_OF_YEAR); //年 if(cTrim(type).equals("Y") || cTrim(type).equals("y")) { interval = eYears - sYears; if(eMonths < sMonths) { --interval; } } //月 else if(cTrim(type).equals("M") || cTrim(type).equals("m")) { interval = 12 * (eYears - sYears); interval += (eMonths - sMonths); } //日 else if(cTrim(type).equals("D") || cTrim(type).equals("d")) { interval = 365 * (eYears - sYears); interval += (eDays - sDays); //除去閏年天數 while(sYears < eYears) { if(isLeapYear(sYears)) { --interval; } ++sYears; } } //如果開始日期更大,則返回負值 if(reversed) { interval = -interval; } //返回計算結果 return interval; } /** * 輸出日歷相關字段(當前日期) * * @param cNow當前時間 * * @return null * * 各個字段值都可以用get(field)得到,也可以用set(field, value)函數修改 * */ private static void printFields(Calendar cNow) { //先用Date類型輸出驗證 SimpleDateFormat df = (SimpleDateFormat)DateFormat.getInstance(); df.applyPattern("yyyy-MM-dd HH:mm:ss"); System.out.println("標準日期:" + df.format(new Date())); //逐個輸出相關字段值 System.out.print("年份:" + cNow.get(Calendar.YEAR) + "\t"); //月份有問題(這里的月份開始計數為0) System.out.print("月份:" + cNow.get(Calendar.MONTH) + "\t"); System.out.print("日期:" + cNow.get(Calendar.DATE) + "\t"); System.out.print("小時:" + cNow.get(Calendar.HOUR) + "\t"); System.out.print("分鐘:" + cNow.get(Calendar.MINUTE) + "\t"); System.out.println("秒鐘:" + cNow.get(Calendar.SECOND)); //本年的第幾天,在計算時間間隔的時候有用 System.out.println("一年中的天數:" + cNow.get(Calendar.DAY_OF_YEAR)); System.out.println("一年中的周數:" + cNow.get(Calendar.WEEK_OF_YEAR)); //即本月的第幾周 System.out.println("一月中的周數:" + cNow.get(Calendar.WEEK_OF_MONTH)); //即一周中的第幾天(這里是以周日為第一天的) System.out.println("一周中的天數:" + cNow.get(Calendar.DAY_OF_WEEK)); } /** * 判定某個年份是否是閏年 * * @param year待判定的年份 * * @return 判定結果 * */ private static boolean isLeapYear(int year) { return (year%400 == 0 || (year%4 == 0 && year%100 != 0)); } /** * * 字符串去除兩頭空格,如果為空,則返回"",如果不空,則返回該字符串去掉前后空格 * * @param tStr輸入字符串 * * @return 如果為空,則返回"",如果不空,則返回該字符串去掉前后空格 * */ public static String cTrim(String tStr) { String ttStr = ""; if (tStr == null) {} else { ttStr = tStr.trim(); } return ttStr; } /** * 比較兩個Date類型的日期大小 * * @param sDate開始時間 * * @param eDate結束時間 * * @return result返回結果(0--相同 1--前者大 2--后者大) * */ private static int compareDate(Date sDate, Date eDate) { int result = 0; //將開始時間賦給日歷實例 Calendar sC = Calendar.getInstance(); sC.setTime(sDate); //將結束時間賦給日歷實例 Calendar eC = Calendar.getInstance(); eC.setTime(eDate); //比較 result = sC.compareTo(eC); //返回結果 return result; } }
程序執行結果如下: