日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java日期类的计算问题_java日期计算(Calendar类)

發(fā)布時間:2025/3/19 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java日期类的计算问题_java日期计算(Calendar类) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

昨天學(xué)了java日期的格式器,主要是用SimpleDateFormat進行格式化、解析。但這還僅停留在日期的查看(調(diào)整顯示格式)階段,更重要的是日期的操作。今天繼續(xù)學(xué)習(xí),記錄如下:

今天主要學(xué)習(xí)的日期操作主要是-----獲取日期字段(年、月、日、年中的天數(shù)、年中的周數(shù)等)、計算兩個時間的間隔日期(年、月、天)、根據(jù)開始時間間隔時間計算結(jié)束時間。

關(guān)于Calendar日歷的字段值,我從JDK中摘抄了一些我認(rèn)為比較重要的,如下:

常規(guī)的年月日時分秒:

static int YEAR

指示年的 get 和 set 的字段數(shù)字。

static int MONTH

指示月份的 get 和 set 的字段數(shù)字。

static int DATE

get 和 set 的字段數(shù)字,指示一個月中的某天。

static int HOUR

get 和 set 的字段數(shù)字,指示上午或下午的小時。

static int MINUTE

get 和 set 的字段數(shù)字,指示一小時中的分鐘

static int SECOND

get 和 set 的字段數(shù)字,指示一分鐘中的秒。

比較有用的幾個字段:

static int DAY_OF_YEAR

get 和 set 的字段數(shù)字,指示當(dāng)前年中的天數(shù)。

static int WEEK_OF_YEAR

get 和 set 的字段數(shù)字,指示當(dāng)前年中的星期數(shù)。

static int WEEK_OF_MONTH

get 和 set 的字段數(shù)字,指示當(dāng)前月中的星期數(shù)。

static int DAY_OF_WEEK

get 和 set 的字段數(shù)字,指示一個星期中的某天。

下面是關(guān)于日期計算的測試代碼,雖然較長,但是調(diào)理很清晰。

/**

* 日期類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

*

* 實現(xiàn)的接口如下:

* 1---根據(jù)開始時間和間隔天數(shù)計算結(jié)束時間 Date calculateEndDate(Date sDate, int days)

* 2---根據(jù)開始時間、結(jié)束時間、間隔類型(年、月、日)計算間隔時間 int calInterval(Date sDate, Date eDate, String type)

* 3---輸出日歷實例(當(dāng)前時間)的各個字段值 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[])

{

//獲取日歷實例并賦予當(dāng)前時間

Calendar cNow = Calendar.getInstance();

cNow.setTime(new Date());

//輸出日歷相關(guān)字段

printFields(cNow);

/*計算兩個日期的時間間隔*/

//開始時間

Date sDate = new Date();

//結(jié)束時間

try {

Date eDate = (new SimpleDateFormat("yyyy-MM-dd")).parse("2012-05-29");

//計算結(jié)果并輸出

System.out.println("今天與2020-05-29相隔:" + calInterval(sDate, eDate, "d") + "天");

} catch (ParseException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

/*計算結(jié)束日期并輸出*/

SimpleDateFormat df = (SimpleDateFormat)DateFormat.getInstance();

df.applyPattern("yyyy-MM-dd");

System.out.println("從幾天開始計算,2天后是:" + df.format(calculateEndDate(sDate, 2)));

}

/**

* 根據(jù)起始日期和間隔時間計算結(jié)束日期

*

* @param sDate開始時間

*

* @param days間隔時間

*

* @return 結(jié)束時間

* */

public static Date calculateEndDate(Date sDate, int days)

{

//將開始時間賦給日歷實例

Calendar sCalendar = Calendar.getInstance();

sCalendar.setTime(sDate);

//計算結(jié)束時間

sCalendar.add(Calendar.DATE, days);

//返回Date類型結(jié)束時間

return sCalendar.getTime();

}

/**

* 計算兩個日期的時間間隔

*

* @param sDate開始時間

*

* @param eDate結(jié)束時間

*

* @param type間隔類型("Y/y"--年 "M/m"--月 "D/d"--日)

*

* @return interval時間間隔

* */

private static int calInterval(Date sDate, Date eDate, String type)

{

//時間間隔,初始為0

int interval = 0;

/*比較兩個日期的大小,如果開始日期更大,則交換兩個日期*/

//標(biāo)志兩個日期是否交換過

boolean reversed = false;

if(compareDate(sDate, eDate) > 0)

{

Date dTest = sDate;

sDate = eDate;

eDate = dTest;

//修改交換標(biāo)志

reversed = true;

}

/*將兩個日期賦給日歷實例,并獲取年、月、日相關(guān)字段值*/

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);

//除去閏年天數(shù)

while(sYears < eYears)

{

if(isLeapYear(sYears))

{

--interval;

}

++sYears;

}

}

//如果開始日期更大,則返回負(fù)值

if(reversed)

{

interval = -interval;

}

//返回計算結(jié)果

return interval;

}

/**

* 輸出日歷相關(guān)字段(當(dāng)前日期)

*

* @param cNow當(dāng)前時間

*

* @return null

*

* 各個字段值都可以用get(field)得到,也可以用set(field, value)函數(shù)修改

* */

private static void printFields(Calendar cNow)

{

//先用Date類型輸出驗證

SimpleDateFormat df = (SimpleDateFormat)DateFormat.getInstance();

df.applyPattern("yyyy-MM-dd HH:mm:ss");

System.out.println("標(biāo)準(zhǔn)日期:" + df.format(new Date()));

//逐個輸出相關(guān)字段值

System.out.print("年份:" + cNow.get(Calendar.YEAR) + "\t");

//月份有問題(這里的月份開始計數(shù)為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("一年中的天數(shù):" + cNow.get(Calendar.DAY_OF_YEAR));

System.out.println("一年中的周數(shù):" + cNow.get(Calendar.WEEK_OF_YEAR));

//即本月的第幾周

System.out.println("一月中的周數(shù):" + cNow.get(Calendar.WEEK_OF_MONTH));

//即一周中的第幾天(這里是以周日為第一天的)

System.out.println("一周中的天數(shù):" + cNow.get(Calendar.DAY_OF_WEEK));

}

/**

* 判定某個年份是否是閏年

*

* @param year待判定的年份

*

* @return 判定結(jié)果

* */

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結(jié)束時間

*

* @return result返回結(jié)果(0--相同 1--前者大 2--后者大)

* */

private static int compareDate(Date sDate, Date eDate)

{

int result = 0;

//將開始時間賦給日歷實例

Calendar sC = Calendar.getInstance();

sC.setTime(sDate);

//將結(jié)束時間賦給日歷實例

Calendar eC = Calendar.getInstance();

eC.setTime(eDate);

//比較

result = sC.compareTo(eC);

//返回結(jié)果

return result;

}

}

程序執(zhí)行結(jié)果如下:

Calendar的字段操作還有些特殊的地方,比如set()、add()等函數(shù)?,F(xiàn)在還沒搞明白。

總結(jié)

以上是生活随笔為你收集整理的java日期类的计算问题_java日期计算(Calendar类)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。