JAVA 日期比較、計算
import java.text.DecimalFormat;
//import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
* 類描述:自己實現的日期計算類,可以自由擴充套件
* @author xieyh [email protected]
* @version build 2005-3-18
*
*/
public class DateCalculate {
/** 注意格里曆和儒略曆交接時的日期差別 */
private static transient int gregorianCutoverYear = 1582;
/** 閏年中每月天數 */
private static final int[] DAYS_P_MONTH_LY=
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
/** 平年中每月天數 */
private static final int[] DAYS_P_MONTH_CY=
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
/** 代表數組裡的年、月、日 */
private static final int Y = 0, M = 1, D = 2;
/** 參與運算用 */
private int[] ymd = null;
/**
* 檢查傳入的引數是否合法的日期
* @param date
* @throws IllegalArgumentException
*/
public static void validate(String date)throws IllegalArgumentException{
int[] ymd = splitYMD( date );
if( ymd[M] == 0 || ymd[M] > 12 ){
throw new IllegalArgumentException("月份數值錯誤");
}
if( true == isLeapYear( ymd[0] ) ){
if( ymd[D] == 0 || ymd[D] > DAYS_P_MONTH_LY[ymd[M] -1 ] ){
throw new IllegalArgumentException("日期數值錯誤");
}
}else{
if( ymd[D] == 0 || ymd[D] > DAYS_P_MONTH_CY[ymd[M] -1 ] ){
throw new IllegalArgumentException("日期數值錯誤");
}
}
}
/**
* 檢查傳入的引數代表的年份是否為閏年
* @param year
* @return
*/
public static boolean isLeapYear(int year) {
return year >= gregorianCutoverYear ?
((year%4 == 0) && ((year%100 != 0) ||
(year%400 == 0))) : // Gregorian
(year%4 == 0); // Julian
}
/**
* 日期加1天,注意這裡沒有考慮儒略曆和格里曆交接時相差的10天
* @param year
* @param month
* @param day
* @return
*/
private int[] addOneDay(int year, int month, int day){
if(isLeapYear( year )){
day++;
if( day > DAYS_P_MONTH_LY[month -1 ] ){
month++;
if(month > 12){
year++;
month = 1;
}
day = 1;
}
}else{
day++;
if( day > DAYS_P_MONTH_CY[month -1 ] ){
month++;
if(month > 12){
year++;
month = 1;
}
day = 1;
}
}
int[] ymd = {year, month, day};
return ymd;
}
/**
* 以迴圈的方式計算日期加法
* @param date
* @param days
* @return
*/
public String addDaysByLoop(String date, int days){
validate(date);
int[] ymd = splitYMD( date );
for(int i = 0; i < days; i++){
ymd = addOneDay(ymd[Y], ymd[M], ymd[D]);
}
return formatYear(ymd[Y])+
formatMonthDay(ymd[M])+
formatMonthDay(ymd[D]);
}
/**
* 日期減1天,注意這裡沒有考慮儒略曆和格里曆交接時相差的10天
* @param year
* @param month
* @param day
* @return
*/
private int[] reduceOneDay(int year, int month, int day){
if(isLeapYear( year )){
day--;
if( day <= 0 ){
month--;
if(month < 1){
year--;
month = 12;
}
day = DAYS_P_MONTH_LY[month -1 ];
}
}else{
day--;
if( day <= 0 ){
month--;
if(month < 1){
year--;
month = 12;
}
day = DAYS_P_MONTH_CY[month -1 ];
}
}
int[] ymd = {year, month, day};
return ymd;
}
/**
* 以迴圈的方式計算日期減法
* @param date
* @param days
* @return
*/
public String reduceDaysByLoop(String date, int days){
validate(date);
int[] ymd = splitYMD( date );
for(int i = 0; i < days; i++){
ymd = reduceOneDay(ymd[Y], ymd[M], ymd[D]);
}
return formatYear(ymd[Y])+
formatMonthDay(ymd[M])+
formatMonthDay(ymd[D]);
}
/**
* 指定日期加上指定的天數的操作
* @param date
* @param days
* @return
* @throws IllegalArgumentException
*/
public String addDays(Date date, int days)
throws IllegalArgumentException{
return addDays(formatDate(date), days);
}
/**
* 指定日期加上指定的天數的操作
* @param date
* @param days
* @return
* @throws IllegalArgumentException
*/
public String addDays(String date, int days)
throws IllegalArgumentException{
validate(date);
ymd = splitYMD( date );
if( isLeapYear( ymd[Y] ) ){
ymd[D] += days;
if( ymd[D] > DAYS_P_MONTH_LY[ymd[M] -1 ] ){
ymd[M] ++;
ymd[D] = ymd[D] - DAYS_P_MONTH_LY[ymd[M] -1-1 ];
if(ymd[M] > 12){
ymd[M] -= 12;
ymd[Y]++;
}
if( ymd[D] > DAYS_P_MONTH_LY[ymd[M] -1 ] ){
addDays(formatYear(ymd[Y])+
formatMonthDay(ymd[M])+
formatMonthDay(DAYS_P_MONTH_LY[ymd[M] -1 ]),
ymd[D] - DAYS_P_MONTH_LY[ymd[M] -1 ]);
}
}
}else{
ymd[D] += days;
if( ymd[D] > DAYS_P_MONTH_CY[ymd[M] -1 ] ){
ymd[M] ++;
ymd[D] = ymd[D] - DAYS_P_MONTH_CY[ymd[M] -1-1 ];
if(ymd[M] > 12){
ymd[M] -= 12;
ymd[Y]++;
}
if( ymd[D] > DAYS_P_MONTH_CY[ymd[M] -1 ] ){
addDays(formatYear(ymd[Y])+
formatMonthDay(ymd[M])+
formatMonthDay(DAYS_P_MONTH_CY[ymd[M] -1 ]),
ymd[D] - DAYS_P_MONTH_CY[ymd[M] -1 ]);
}
}
}
return formatYear(ymd[Y])+
formatMonthDay(ymd[M])+
formatMonthDay(ymd[D]);
}
/**
* 指定日期減去指定的天數的操作
* @param date
* @param days
* @return
* @throws IllegalArgumentException
*/
public String reduceDays(Date date, int days)
throws IllegalArgumentException{
return reduceDays(formatDate(date), days);
}
/**
* 指定日期減去指定的天數的操作
* @param date
* @param days
* @return
* @throws IllegalArgumentException
*/
public String reduceDays(String date, int days)
throws IllegalArgumentException{
validate(date);
ymd = splitYMD( date );
if( isLeapYear( ymd[Y] ) ){
ymd[D] -= days;
if( ymd[D] <= 0 ){
ymd[M] --;
if(ymd[M] < 1){
ymd[M] += 12;
ymd[Y]--;
}
ymd[D] = ymd[D] + DAYS_P_MONTH_LY[ ymd[M]-1 ];
if( ymd[D] <= 0 ){
reduceDays(formatYear(ymd[Y])+
formatMonthDay(ymd[M])+
formatMonthDay( 1 ),
abs( ymd[D] - 1 ));
}
}
}else{
ymd[D] -= days;
if( ymd[D] <= 0 ){
ymd[M] --;
if(ymd[M] < 1){
ymd[M] += 12;
ymd[Y]--;
}
ymd[D] = ymd[D] + DAYS_P_MONTH_CY[ ymd[M]-1 ];
if( ymd[D] <= 0 ){
reduceDays(formatYear(ymd[Y])+
formatMonthDay(ymd[M])+
formatMonthDay(1),
abs( ymd[D] - 1 ));
}
}
}
return formatYear(ymd[Y])+
formatMonthDay(ymd[M])+
formatMonthDay(ymd[D]);
}
/**
* 格式化一個日期字串
* @param date
* @return
*/
public static String formatDate(Date date){
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
return sdf.format( date );
}
/**
* 將代表日期的字串分割為代表年月日的整形陣列
* @param date
* @return
*/
public static int[] splitYMD(String date){
int[] ymd = {0, 0, 0};
ymd[Y] = Integer.parseInt(date.substring(0, 4));
ymd[M] = Integer.parseInt(date.substring(4, 6));
ymd[D] = Integer.parseInt(date.substring(6, 8));
return ymd;
}
/**
* 將不足兩位的月份或日期補足為兩位
* @param decimal
* @return
*/
public static String formatMonthDay(int decimal){
DecimalFormat df = new DecimalFormat("00");
return df.format( decimal );
}
/**
* 將不足四位的年份補足為四位
* @param decimal
* @return
*/
public static String formatYear(int decimal){
DecimalFormat df = new DecimalFormat("0000");
return df.format( decimal );
}
/**
* 取絕對值操作
* @param num
* @return
*/
public static int abs(int num){
return (num > 0) ? num : -num;
}
/**
* 測試用main函式
* @param args
*/
public static void main( String[] args ) throws Exception{
String currDate = "20001231";
String currDate2 = "20001231";
int days = -36600;
Date date = null;
DateCalculate dc = new DateCalculate();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
date = sdf.parse( currDate2 );
System.out.println(currDate + " + " +
abs(days) + "days = " + dc.addDays(currDate, abs(days)));
System.out.println(currDate + " - " +
abs(days) + "days = " + dc.reduceDays(currDate, abs(days)));
Calendar cld = Calendar.getInstance();
cld.setTime( date );
cld.add(Calendar.DATE, abs(days));
System.out.println(currDate2 + " + " +
abs(days) + "days = " + sdf.format(cld.getTime()));
cld = Calendar.getInstance();
cld.setTime( date );
cld.add(Calendar.DATE, days);
System.out.println(currDate2 + " - " +
abs(days) + "days = " + sdf.format(cld.getTime()));
System.out.println(dc.addDaysByLoop(currDate2, abs(days)));
System.out.println(dc.reduceDaysByLoop(currDate2, abs(days)));
}
========================================================================================
java日期比較
java的日期比較方法(精確到秒):
public boolean compDate(String s1,String s2){
int day=0;
SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd");
GregorianCalendar calendar1=new GregorianCalendar();
GregorianCalendar calendar2=new GregorianCalendar();
//String s1="2006-04-21";
//String s2="2006-04-25";
Date xxx1=new Date();
Date xxx2=new Date();
try {
xxx1=sf.parse(s1);
xxx2=sf.parse(s2);
day = (int) ((xxx2.getTime() - xxx1.getTime()) / 3600 / 24 / 1000);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(day>10){
return true;
}else{
return false;
}
}
========================================================================================
計算Java日期
Java統計從1970年1月1日起的毫秒的數量表示日期。也就是說,例如,1970年1月2日,是在1月1日後的86,400,000毫秒。同樣的,1969年12月31日是在1970年1月1日前86,400,000毫秒。Java的Date類使用long型別紀錄這些毫秒值.因為long是有符號整數,所以日期可以在1970年1月1日之前,也可以在這之後。Long型別表示的最大正值和最大負值可以輕鬆的表示290,000,000年的時間,這適合大多數人的時間要求。
Date 類
Date類可以在java.util包中找到,用一個long型別的值表示一個指定的時刻。它的一個有用的建構函式是Date(),它建立一個表示建立時刻的物件。getTime()方法返回Date物件的long值。在下面的程式中,我使用Date()建構函式建立一個表示程式執行時刻的物件,並且利用getTime()方法找到這個日期代表的毫秒數量:
import java.util.*;
public class Now {
public static void main(String[] args) {
Date now = new Date();
long nowLong = now.getTime();
System.out.println("Value is " + nowLong);
}
}
當我執行這個程式後,我得到972,568,255,150.快速確認一下這個數字,起碼在一個合理的範圍:它不到31年,這個數值相對1970年1月1日到我寫這篇文章的時間來說,是合理的。計算機是這個毫秒值表示時間,人們可不願意說" 我將在996,321,998,34見到你。"幸運的是,Java提供了一個轉換Date物件到字串的途徑,表示成傳統的形式。我們在下一節討論DateFormat類,它直觀的建立日期字串。
DateFormat類
DateFormat類的一個目標是建立一個人們能夠識別的字串。然而,因為語言的差別,不是所有的人希望看到嚴格的相同格式的日期。法國人更喜歡看到"25 decembre 2000,",但是美國人習慣看到"December 25,2000."所以一個DateFormat的例項建立以後,這個物件包含了日期的顯示格式的資訊。如果使用使用者電腦區域設定預設的格式,你可以象下面那樣,建立DateFormat物件,使用getDateInstance()方法:
DateFormat df = DateFormat.getDateInstance();
DateFormat類在java.text包中可以找到。
轉換成字串
你可以使用format()方法轉換Date物件為一個字串。下面的示例程式說明了這個問題:
import java.util.*;
import java.text.*;
public class NowString {
public static void main(String[] args) {
Date now = new Date();
DateFormat df = DateFormat.getDateInstance();
String s = df.format(now);
System.out.println("Today is " + s);
}
}
在上面的程式碼中,展示了沒有引數,使用預設格式的getDateInstance()方法。Java還提供了幾個選擇日期格式,你可以通過使用過載的getDateInstance(int style)獲得。出於方便的原因,DateFormat提供了幾種預置的常量,你可以使用這些常量引數。下面是幾個SHORT, MEDIUM, LONG, 和FULL型別的示例:
import java.util.*;
import java.text.*;
public class StyleDemo {
public static void main(String[] args) {
Date now = new Date();
DateFormat df = DateFormat.getDateInstance();
DateFormat df1 = DateFormat.getDateInstance(DateFormat.SHORT);
DateFormat df2 = DateFormat.getDateInstance(DateFormat.MEDIUM);
DateFormat df3 = DateFormat.getDateInstance(DateFormat.LONG);
DateFormat df4 = DateFormat.getDateInstance(DateFormat.FULL);
String s = df.format(now);
String s1 = df1.format(now);
String s2 = df2.format(now);
String s3 = df3.format(now);
String s4 = df4.format(now);
System.out.println("(Default) Today is " + s);
System.out.println("(SHORT) Today is " + s1);
System.out.println("(MEDIUM) Today is " + s2);
System.out.println("(LONG) Today is " + s3);
System.out.println("(FULL) Today is " + s4);
}
}
程式輸出如下:
(Default) Today is Nov 8, 2000
(SHORT) Today is 11/8/00
(MEDIUM) Today is Nov 8, 2000
(LONG) Today is November 8, 2000
(FULL) Today is Wednesday, November 8, 2000
同樣的程式,在我的電腦上使用預設設定執行後,改變區域設定為瑞典,輸出如下:
(Default) Today is 2000-nov-08
(SHORT) Today is 2000-11-08
(MEDIUM) Today is 2000-nov-08
(LONG) Today is den 8 november 2000
(FULL) Today is den 8 november 2000
從這裡,你能看到,瑞典的月份不是大寫的(雖然November還是november).還有,LONG和FULL版本在瑞典語中是一樣的,但是美國英語卻不同。另外,有趣的是,瑞典語單詞的星期三,onsdag,沒有包含在FULL日期裡,英語卻包括。
注意你能夠使用getDateInstance()方法改變DateFormat例項的語種;但是,在上面的例子中,是通過改變Windows98的控制面板的區域設定做到的。不同的地方的區域設定不同,結果就不同,這樣有好處,也有不足,Java程式設計師應該瞭解這些。一個好處是Java程式設計師可以只寫一行程式碼就可以顯示日期,而且世界不同地區的電腦運行同樣的程式會有不用的日期格式。 但是這也是一個缺點,當程式設計師希望顯示同一種格式的時--這也有可取之處,舉例來說,在程式中混合輸出文字和日期,如果文字是英文,我們就不希望日期格式是其他的格式,象德文或是西班牙文。如果程式設計師依靠日期格式程式設計,日期格式將根據執行程式所在電腦的區域設定不用而不同。
解析字串
通過parse()方法,DateFormat能夠以一個字串創立一個Date物件。這個方法能丟擲ParseException異常,所以你必須使用適當的異常處理技術。下面的例子程式通過字串建立Date物件:
import java.util.*;
import java.text.*;
public class ParseExample {
public static void main(String[] args) {
String ds = "November 1, 2000";
DateFormat df = DateFormat.getDateInstance();
try {
Date d = df.parse(ds);
}
catch(ParseException e) {
System.out.println("Unable to parse " + ds);
}
}
}
在建立一個任意的日期時parse()方法很有用。我將通過另一種方法建立一個任意得日期。同時,你將看到怎樣進行基本日期計算,例如計算90天后的另一天。你可以使用GregorianCalendar類來完成這個任務。
GregorianCalendar類
建立一個代表任意日期的一個途徑使用GregorianCalendar類的建構函式,它包含在java.util包中:
GregorianCalendar(int year, int month, int date)
注意月份的表示,一月是0,二月是1,以此類推,是12月是11。因為大多數人習慣於使用單詞而不是使用數字來表示月份,這樣程式也許更易讀,父類Calendar使用常量來表示月份:JANUARY, FEBRUARY,等等。所以,建立Wilbur 和 Orville製造第一架動力飛機的日期(December 17, 1903),你可以使用:
GregorianCalendar firstFlight = new GregorianCalendar(1903, Calendar.DECEMBER, 17);
出於清楚的考慮,你應該使用前面的形式。但是,你也應該學習怎樣閱讀下面的短格式。下面的例子同樣表示December 17,1903(記住,在短格式中,11表示December)
GregorianCalendar firstFlight = new GregorianCalendar(1903, 11, 17);
在上一節中,你學習了轉換Date物件到字串。這裡,你可以做同樣的事情;但是首先,你需要將GregorianCalendar物件轉換到Date。要做到這一點,你可以使用getTime()方法,從它得父類Calendar繼承而來。GetTime()方法返回GregorianCalendar相應的Date物件。你能夠建立GregorianCalendar物件,轉換到Date物件,得到和輸出相應的字串這樣一個過程。下面是例子:
import java.util.*;
import java.text.*;
public class Flight {
public static void main(String[] args) {
GregorianCalendar firstFlight = new GregorianCalendar(1903, Calendar.DECEMBER, 17);
Date d = firstFlight.getTime();
DateFormat df = DateFormat.getDateInstance();
String s = df.format(d);
System.out.println("First flight was " + s);
}
}
有時候建立一個代表當前時刻的GregorianCalendar類的例項是很有用的。你可以簡單的使用沒有引數的GregorianCalendar建構函式,象這樣:
GregorianCalendar thisday = new GregorianCalendar();
一個輸出今天日期的例子程式,使用GregorianCalendar物件:
import java.util.*;
import java.text.*;
class Today {
public static void main(String[] args) {
GregorianCalendar thisday = new GregorianCalendar();
Date d = thisday.getTime();
DateFormat df = DateFormat.getDateInstance();
String s = df.format(d);
System.out.println("Today is " + s);
}
}
注意到,Date()建構函式和GregorianCalendar()建構函式很類似:都建立一個物件,條件簡單,代表今天。
日期處理
GregorianCalendar類提供處理日期的方法。一個有用的方法是add().使用add()方法,你能夠增加象年,月數,天數到日期物件中。要使用add()方法,你必須提供要增加的欄位,要增加的數量。一些有用的欄位是DATE, MONTH, YEAR, 和 WEEK_OF_YEAR。下面的程式使用add()方法計算未來80天的一個日期。在Jules的<環球80天>是一個重要的數字,使用這個程式可以計算Phileas Fogg從出發的那一天1872年10月2日後80天的日期:
import java.util.*;
import java.text.*;
public class World {
public static void main(String[] args) {
GregorianCalendar worldTour = new GregorianCalendar(1872, Calendar.OCTOBER, 2);
worldTour.add(GregorianCalendar.DATE, 80);
Date d = worldTour.getTime();
DateFormat df = DateFormat.getDateInstance();
String s = df.format(d);
System.out.println("80 day trip will end " + s);
}
}
這個例子是想象的,但在一個日期上增加天數是一個普遍的操作:影碟可以租3天,圖書館可以借書21天,商店經常需要將購買的物品在30天內賣出。下面的程式演示了使用年計算:
import java.util.*;
import java.text.*;
public class Mortgage {
public static void main(String[] args) {
GregorianCalendar mortgage = new GregorianCalendar(1997, Calendar.MAY, 18);
mortgage.add(Calendar.YEAR, 15);
Date d = mortgage.getTime();
DateFormat df = DateFormat.getDateInstance();
String s = df.format(d);
System.out.println("15 year mortgage amortized on " + s); }
}
add()一個重要的副作用是它改變的原來的日期。有時候,擁有原始日期和修改後的日期很重要。不幸的是,你不能簡單的建立一個GregorianCalendar物件,設定它和原來的相等(equal)。原因是兩個變數指向同一個Date()物件地址。如果Date物件改變,兩個變數就指向改變後的日期物件。代替這種做法,應該建立一個新物件。下面的程式示範了這種做法:
import java.util.*;
import java.text.*;
public class ThreeDates {
public static void main(String[] args) {
GregorianCalendar gc1 = new GregorianCalendar(2000, Calendar.JANUARY, 1);
GregorianCalendar gc2 = gc1;
GregorianCalendar gc3 = new GregorianCalendar(2000, Calendar.JANUARY, 1);
//Three dates all equal to January 1, 2000
gc1.add(Calendar.YEAR, 1);
file://gc1 and gc2 are changed
DateFormat df = DateFormat.getDateInstance();
Date d1 = gc1.getTime();
Date d2 = gc2.getTime();
Date d3 = gc3.getTime();
String s1 = df.format(d1);
String s2 = df.format(d2);
String s3 = df.format(d3);
System.out.println("gc1 is " + s1);
System.out.println("gc2 is " + s2);
System.out.println("gc3 is " + s3);
}
}
程式執行後,gc1和gc2被變成2001年(因為兩個物件指向同一個Date,而Date已經被改變了)。物件gc3指向一個單獨的Date,它沒有被改變。
計算複習日期
在這節,你將看到一個依據現實世界的例子。這個詳細的程式計算過去一個具體的日期。例如,你閱讀這篇文章,你想要記住一個印象深刻的知識點。如果你沒有照片一樣的記憶力,你就要定期的複習這些新資料,這將幫助你記住它。關於複習系統,Kurt Hanks 和 Gerreld L. Pulsipher在他們的< Five Secrets to Personal Productivity個人能力的5個祕密>中有討論,建議看過第一眼後馬上回顧一下,然後是1天后,1個星期後,1個月後,3個月後,1年後。我的這篇文章,你要馬上回顧一下,從現在算起,再就是明天,然後是1個星期,1個月,3個月,1年後。我們的程式將計算這些日期。
這個程式非常有用的,它將是PIM(Personal Information Manager個人資訊管理器)的一個組成部分,並將確定複習時間。在下面的程式中,getDates()方法對一個返回日期陣列(複習日期)的電子軟體很有用。另外,你可以返回單獨的一個日期,使用getFirstDay(),getOneDay(),getOneWeek(),getOnMonth()和getOneYear().當時間範圍超出這個PIM的ReviewDates的計算範圍時ReviewDates類演示了怎樣計算時間段。現在,你可以容易的修改它用來處理你需要的時間段,象圖書館借書,錄影帶租賃和抵押計算。首先,ReviewDates類顯示在下面:
import java.util.*;
import java.text.*;
public class ReviewDates {
private GregorianCalendar firstDay, oneDay, oneWeek, oneMonth, oneQuarter, oneYear;
final int dateArraySize = 6;
ReviewDates(GregorianCalendar gcDate) {
int year = gcDate.get(GregorianCalendar.YEAR);
int month = gcDate.get(GregorianCalendar.MONTH);
int date = gcDate.get(GregorianCalendar.DATE);
firstDay = new GregorianCalendar(year, month, date);
oneDay = new GregorianCalendar(year, month, date);
oneWeek = new GregorianCalendar(year, month, date);
oneMonth = new GregorianCalendar(year, month, date);
oneQuarter = new GregorianCalendar(year, month, date);
oneYear = new GregorianCalendar(year, month, date);
oneDay.add(GregorianCalendar.DATE, 1);
oneWeek.add(GregorianCalendar.DATE, 7);
oneMonth.add(GregorianCalendar.MONTH, 1);
oneQuarter.add(GregorianCalendar.MONTH, 3);
oneYear.add(GregorianCalendar.YEAR, 1);
}
ReviewDates() {
this(new GregorianCalendar());
}
public void listDates() {
DateFormat df = DateFormat.getDateInstance(DateFormat.LONG);
Date startDate = firstDay.getTime();
Date date1 = oneDay.getTime();
Date date2 = oneWeek.getTime();
Date date3 = oneMonth.getTime();
Date date4 = oneQuarter.getTime();
Date date5 = oneYear.getTime();
String ss = df.format(startDate);
String ss1 = df.format(date1);
String ss2 = df.format(date2);
String ss3 = df.format(date3);
String ss4 = df.format(date4);
String ss5 = df.format(date5);
System.out.println("Start date is " + ss);
System.out.println("Following review dates are:");
System.out.println(ss1);
System.out.println(ss2);
System.out.println(ss3);
System.out.println(ss4);
System.out.println(ss5);
System.out.println();
}
public GregorianCalendar[] getDates() {
GregorianCalendar[] memoryDates = new GregorianCalendar[dateArraySize];
memoryDates[0] = firstDay;
memoryDates[1] = oneDay;
memoryDates[2] = oneWeek;
memoryDates[3] = oneMonth;
memoryDates[4] = oneQuarter;
memoryDates[5] = oneYear;
return memoryDates;
}
public GregorianCalendar getFirstDay() {
return this.firstDay;
}
public GregorianCalendar getOneDay() {
return this.oneDay;
}
public GregorianCalendar getOneWeek() {
return this.oneWeek;
}
public GregorianCalendar getOneMonth() {
return this.oneMonth;
}
public GregorianCalendar getOneQuarter() {
return this.oneQuarter;
}
public GregorianCalendar getOneYear() {
return this.oneYear;
}
}
下面是使用ReviewDates類列出複習日期的例子程式:
import java.util.*;
public class ShowDates {
public static void main(String[] args) {
ReviewDates rd = new ReviewDates();
rd.listDates();
GregorianCalendar gc = new GregorianCalendar(2001, Calendar.JANUARY, 15);
ReviewDates jan15 = new ReviewDates(gc);
jan15.listDates();
}
}
總結
這篇文章介紹了關於日期處理的3個重要的類:Date,DateFormat,GregorianCalendar.這些類讓你建立日期,轉換成字串,和計算日期基本元素。處理Java中的日期問題,這篇文章只是冰山一角。可是,我在這裡介紹的類和方法不僅僅是你學習高階技術的跳板,這些類和方法本身就可以處理很多通常的日期相關的任務
關於作者
Robert Nielsen是SCJP。他擁有碩士學位,專攻計算機教育,並且在計算機領域執教多年。他也在各樣的雜誌上發表過很多計算機相關的文章
相關推薦
JAVA 日期比較、計算
import java.text.DecimalFormat;//import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.u
Java 日期比較(上下午篇)
Java 日期比較 (上下午篇) 一、java.util.Date篇 Date date = new Date(); Date dateTime1 = new Date(date.getYear(),
Java 日期比較大小
import java.text.Format; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * 日期比較大小的兩種方式 *
Java 字串比較、拼接問題
@[TOC](字串的比較) /——————————————————**字串型別**—————————————————/ Java中用於處理字串常用的有三個類: 1、java.lang.String 2、java.lang.StringBuffer 3、java.lang.StrungBuilder 相
Java 計算日期加、減一天
public static void main(String[] args) throws ParseException { SimpleDateFormat
java 日期加減天數、月數、年數的計算方式+java實現給指定日期加固定小時、天、月+java判斷當前日期是星期幾
本篇文章主要介紹一下Calendar類的對時間對一些使用方法:java 日期加減天數、月數、年數的計算方式, java實現給指定日期加固定小時、天、月,java判斷當前日期是星期幾,java判斷某個時間是否在條件時間之內。 程式碼: public static voi
js格式化日期、計算時間差
js格式化日期、計算時間差var startTime ="20170501"var endTime = "20170430"var pattern = /(\d{4})(\d{2})(\d{2})/;var startTime_f = startTime.replace(pattern, ‘$1-$2-$3‘
Java中String、StringBuilder、StringBuffer常用源碼分析及比較(一):String源碼分析
array string類 都是 epo sys 匹配字符串 bound 地址 簡單 String: 一、成員變量: /** The value is used for character storage. */ private final char value[
Java中String、StringBuilder、StringBuffer常用源碼分析及比較(二):StringBuilder、StringBuffer源碼分析
string類型 character private 字符 代碼 less pri des over StringBuilder: 一、構造方法: /** * Constructs a string builder with no characters in i
Java中String、StringBuilder、StringBuffer常用源碼分析及比較(三):String、StringBuilder、StringBuffer比較
val str 成員變量 相同 += let .get end art 看這篇隨筆之前請務必先看前面兩章: Java中String、StringBuilder、StringBuffer常用源碼分析及比較(一):String源碼分析 Java中String、StringBui
java java中subString、split、stringTokenizer三種擷取字串方法的效能比較
面試的時候,string 基本上是必須問的知識 突然想起面試的時候曾經被人問過:都知道在大資料量情況下,使用String的split擷取字串效率很低,有想過用其他的方法替代嗎?用什麼替代?我當時的回答很斬釘截鐵:沒有。 google了一下,發現有2中替代方法,於
高併發程式設計系列:4種常用Java執行緒鎖的特點,效能比較、使用場景
高併發程式設計系列:4種常用Java執行緒鎖的特點,效能比較、使用場景 http://youzhixueyuan.com/4-kinds-of-java-thread-locks.html 在Java併發程式設計中,經常遇到多個執行緒訪問同一個 共享資源 ,這時候作為開發者
rabbitmq direct、fanout、topic 三種Exchange java 程式碼比較
Producer端 1、channel的建立 無論是才用什麼樣的Exchange,建立channel程式碼都是相同的,如下 1 ConnectionFactory factory = new ConnectionFactory(); 2 factory
Java 處理日期年、月、日、周加減運算
1.java 日期加減運算 GregorianCalendar gc = new GregorianCalendar(); //java中對日期的加減操作 gc.add(1,-1);//表示年份減一. gc.add(2,-1);//表示月份減一. gc.add(3,-1);//表示周減一
python日期模組datetime常用操作總結(字串與datetime物件互轉、日期差值計算、時間戳獲取、時間陣列生成等)
在python中,自帶的datetime和time兩個時間模組在平時的使用中可以滿足我們絕大多數的需求,但是由於缺乏對這些模組深度的瞭解和使用,導致平時能夠使用到的時間功能十分有限,例如:對於time模組,我的使用幾乎就是停留在程式執行時間的統計和時間戳生成這
4種常用Java執行緒鎖的特點,效能比較、使用場景
文章目錄 多執行緒的緣由 多執行緒併發面臨的問題 4種Java執行緒鎖(執行緒同步) Java執行緒鎖總結 多執行緒的緣由 在出現了程序之後,作業系統的效能得到了大大的提升。雖然程序的出現解決了作業系統的併
Postgresql、HiveQL時間日期比較及加減寫法
一、postgreSQL ----當前時間 now() >>2018-09-14 16:46:51.103709+08 current_timestamp >>2018-09-14 16:47:58.547305+08----當前日期 cur
java中的日期轉換、springmvc接收前臺的Date型別引數遇到的坑
關於springmvc接收前臺傳的時間型別引數 前臺jsp用的一個日期外掛,後臺獲取一直有問題。 被這個問題搞了好久,其實很簡單。記錄下來,希望可以幫到遇到同樣問題的同學。 我專案使用的ssm框架, 在做web開發的時候,頁面傳入的都是String型別,SpringMVC可以對一些基本的型別
Java集合——HashMap、HashTable以及ConCurrentHashMap異同比較
0. 前言 HashMap和HashTable的區別一種比較簡單的回答是: (1)HashMap是非執行緒安全的,HashTable是執行緒安全的。 (2)HashMap的鍵和值都允許有null存在,而HashTable則都不行。 (3)因為執行緒安全、雜湊效率的
Java 日期時間比較
Java使用以下三種方法來比較兩個日期: 使用 getTime() 方法獲取兩個日期(自1970年1月1日經歷的毫秒數值),然後比較這兩個值。 使用方法 before(),after() 和 equals()。例如,一個月的12號比18號早,則 new Date(99,