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;
}
}
程序執行結果如下:
