java日歷類
㈠ java calendar類
這是一個關於日歷的程序,主要是輸出了兩條信息,第一條是現在是哪年哪月哪日星期幾,輸出的第二個信息就是1945年8月15日和1931年9月18日相隔多少天。想看明白這個程序並不難,他就是通過Calenar對象來獲得一些時間信息,比如calendar.get(Calendar.YEAR))這句就是獲取現在是多少年,這些方法你記住就行了,具體是怎麼獲得到得都是sun公司自己實現的,你沒必要去知道他是怎麼實現的,如果你要是對源代碼感興趣也可以看看。
㈡ Java中日歷類(CalendarClass)的用途
Java中日歷類(Calendar類)的用途如下:
Calendar類的靜態方法getInstance()可以初始化一個日歷對象:Calendar now = Calendar.getInstance();
可以使用下面三個方法把日歷定到任何一個時間:
set(intyear,intmonth,intdate);
set(intyear,intmonth,intdate,inthour,intminute);
set(intyear,intmonth,intdate,inthour,intminute,intsecond);
如果想獲得年份、月份、小時等信息可以使用:
Now.get(Calendar.Month);//這樣的方法0表示一月,1表示二月
get(Calendar.DAY_OF_MONTH);//獲得這個月的第幾天
get(Calendar.DAY_OF_WEEK);//獲得這個星期的第幾天
get(Calendar.DAY_OF_YEAR);//獲得這個年的第幾天
getTimeMillis();//獲得當前時間的毫秒錶示
1.計算某一月份的最大天數
Calendartime=Calendar.getInstance();
time.clear();
time.set(Calendar.YEAR,year);
time.set(Calendar.MONTH,i-1);//注意,Calendar對象默認一月為0
intday=time.getActualMaximum(Calendar.DAY_OF_MONTH);//本月份的天數
註:在使用set方法之前,必須先clear一下,否則很多信息會繼承自系統當前時間
2.Calendar和Date的轉化
(1) Calendar轉化為Date
Calendarcal=Calendar.getInstance();
Datedate=cal.getTime();
(2) Date轉化為Calendar
Datedate=newDate();
Calendarcal=Calendar.getInstance();
cal.setTime(date);
3.格式化輸出日期時間
Datedate=newDate();
SimpleDateFormatdf=newSimpleDateFormat("yyyy-MM-ddhh:mm:ss");
System.out.println(df.format(date));
4.計算相隔天數的方法
publicintgetDaysBetween(Calendard1,Calendard2){
if(d1.after(d2)){//
java.util.Calendarswap=d1;
d1=d2;
d2=swap;
}
intdays=d2.get(Calendar.DAY_OF_YEAR)-d1.get(Calendar.DAY_OF_YEAR);
inty2=d2.get(Calendar.YEAR);
if(d1.get(Calendar.YEAR)!=y2){
d1=(Calendar)d1.clone();
do{
days+=d1.getActualMaximum(Calendar.DAY_OF_YEAR);//得到當年的實際天數
d1.add(Calendar.YEAR,1);
}while(d1.get(Calendar.YEAR)!=y2);
}
returndays;
}
㈢ Java中中關於Calendar類的幾點注意事項
在使用Java的Calendar類會遇到的幾個問題,這里整理一下,供參考
在獲取月份時,Calendar.MONTH + 1 的原因
Java中的月份遵循了羅馬歷中的規則:當時一年中的月份數量是不固定的,第一個月是JANUARY。而Java中Calendar.MONTH返回的數值其實是當前月距離第一個月有多少個月份的數值,所以月份為JANUARY在Java中返回「0」,依次類推也就是在取Calendar.MONTH的值時我們需要+1。
2. 在獲取星期幾 Calendar.DAY_OF_WEEK – 1 的原因
Java中Calendar.DAY_OF_WEEK其實表示:一周中的第幾天,所以他會受到第一天是星期幾的影響。
有些地區以星期日作為一周的第一天,而有些地區以星期一作為一周的第一天,這2種情況是需要區分的。
看下錶的返回值
所以Calendar.DAY_OF_WEEK需要根據本地化設置的不同而確定是否需要 「-1」
Java中設置不同地區的輸出可以使用 Locale.setDefault(Locale.地區名) 來實現。
3. 獲取日期時 Calendar.DAY_OF_MONTH 不需要特殊的操作,他直接返回一個月中的第幾天
㈣ 如何用java里的Calendar類編寫萬年歷
/*
題目:輸出任意年份任意月份的日歷表(公元後)
思路:
1.已知1年1月1日是星期日,1%7=1對應的是星期日,2%7=2對應的是星期一,以此類推;
2.計算當年以前所有天數+當年當月1號之前所有天數;
a.年份分平年閏年,平年365天,閏年366天;
b.閏年的判斷方法year%400==0||(year%100!=0&&year%4==0)若為真,則為閏年否則為平年;
c.定義平年/閏年數組,包含各月天數;
d.遍歷數組求和,計算當年當月前總天數;
e.當年以前所有天數+當年當月前總天數+1即為1年1月1日到當年當月1日的總天數;
3.總天數對7取模,根據結果判斷當月1號是星期幾,輸出空白區域;
4.輸出當月日歷表,逢星期六換行
*/
importjava.util.Scanner;
classFindMonthList{
publicstaticvoidmain(String[]args){
Scannersc=newScanner(System.in);
System.out.println("請輸入年份:");
intyear=sc.nextInt();//年份
if(year<1){//判斷非法輸入年份
System.out.println("輸入錯誤!");
return;
}
System.out.println("請輸入月份:");
intmonth=sc.nextInt();//月份
if(month<1||month>12){//判斷非法輸入月份
System.out.println("輸入錯誤!");
return;
}
//輸出表頭
System.out.println("-------"+year+"年"+month+"月"+"-------");
System.out.println();
System.out.println("日一二三四五六");
//計算當前年份以前所有天數beforeYearTotalDay;每4年一個閏年,閏年366天,平年365天
intbeforeYearTotalDay=((year-1)/4*366)+(year-1-((year-1)/4))*365;
int[]arrLeapYear={0,31,29,31,30,31,30,31,31,30,31,30,31};//閏年各月天數int數組
int[]arrNormalYear={0,31,28,31,30,31,30,31,31,30,31,30,31};//平年各月天數int數組
intbeforeMonthTotalDay=0;//定義本年當月之前月份的總天數
if(year%400==0||(year%100!=0&&year%4==0)){//判斷當前年份是否是閏年
for(inti=0;i<month;i++){//for循環計算當月之前總天數
//計算當前月份之前的所有天數
beforeMonthTotalDay=beforeMonthTotalDay+arrLeapYear[i];
}
//判斷當月1日是星期幾
inttotalDay=beforeYearTotalDay+beforeMonthTotalDay+1;
intweek=totalDay%7;//已知1年1月1日是星期日,即模7得1對應的是星期日
for(inti=0;i<(week-1+7)%7;i++){//如果寫成i<(week-1)會出現i<-1的情況
System.out.print("");//輸出開頭空白
}
for(inti=1;i<=arrLeapYear[month];i++){//for循環輸出各月天數
System.out.print(i+"");
if(i<10){//小於10的數補一個空格,以便列印整齊
System.out.print("");
}
if(i%7==((7-(week-1))%7)||i==arrLeapYear[month]){//每逢星期六/尾數換行
System.out.println();
}
}
}else{//不是閏年就是平年
for(inti=0;i<month;i++){//for循環計算出當月之前月份總天數
beforeMonthTotalDay=beforeMonthTotalDay+arrNormalYear[i];
}
//判斷當月1日是星期幾
inttotalDay=beforeYearTotalDay+beforeMonthTotalDay+1;
intweek=totalDay%7;//已知1年1月1日是星期日,即模7得1對應的是星期日
for(inti=0;i<(week-1+7)%7;i++){//如果寫成i<(week-1)會出現i<-1的情況
System.out.print("");//輸出開頭空白
}
for(inti=1;i<=arrNormalYear[month];i++){//for循環輸出各月天數
System.out.print(i+"");
if(i<10){//小於10的數補一個空格,以便列印整齊
System.out.print("");
}
if(i%7==((7-(week-1))%7)||i==arrNormalYear[month]){//每逢星期六/尾數換行
System.out.println();
}
}
}
}
}
㈤ JAVA中日歷類日期類應怎樣去使用
java中的日歷類和日期類是java.util.Calendar或者是java.util.Date
按照其它的調用類和類方法去調用這兩個類就可以了
用的時候選其一就可以了。
㈥ 如何在Java中獲取日歷類(CalendarClass)的實例
直接new出來這個對象就行,可以參考如圖所示的例子:
㈦ java中的calendar類主要有那些方法
abstract void add(int field, int amount)
根據日歷的規則,為給定的日歷欄位添加或減去指定的時間量。
boolean after(Object when)
判斷此 Calendar 表示的時間是否在指定 Object 表示的時間之後,返回判斷結果。
boolean before(Object when)
判斷此 Calendar 表示的時間是否在指定 Object 表示的時間之前,返回判斷結果。
void clear()
將此 Calendar 的所日歷欄位值和時間值(從歷元至現在的毫秒偏移量)設置成未定義。
void clear(int field)
將此 Calendar 的給定日歷欄位值和時間值(從歷元至現在的毫秒偏移量)設置成未定義。
Object clone()
創建並返回此對象的一個副本。
int compareTo(Calendar anotherCalendar)
比較兩個 Calendar 對象表示的時間值(從歷元至現在的毫秒偏移量)。
protected void complete()
填充日歷欄位中所有未設置的欄位。
protected abstract void computeFields()
將當前毫秒時間值 time 轉換為 fields[] 中的日歷欄位值。
protected abstract void computeTime()
將 fields[] 中的當前日歷欄位值轉換為毫秒時間值 time。
boolean equals(Object obj)
將此 Calendar 與指定 Object 比較。
int get(int field)
返回給定日歷欄位的值。
int getActualMaximum(int field)
給定此 Calendar 的時間值,返回指定日歷欄位可能擁有的最大值。
int getActualMinimum(int field)
給定此 Calendar 的時間值,返回指定日歷欄位可能擁有的最小值。
static Locale[] getAvailableLocales()
返回所有語言環境的數組,此類的 getInstance 方法可以為其返回本地化的實例。
String getDisplayName(int field, int style, Locale locale)
返回給定 style 和 locale 下的日歷 field 值的字元串表示形式。
Map<String,Integer> getDisplayNames(int field, int style, Locale locale)
返回給定 style 和 locale 下包含日歷 field 所有名稱的 Map 及其相應欄位值。
int getFirstDayOfWeek()
獲取一星期的第一天;例如,在美國,這一天是 SUNDAY,而在法國,這一天是 MONDAY。
abstract int getGreatestMinimum(int field)
返回此 Calendar 實例給定日歷欄位的最高的最小值。
static Calendar getInstance()
使用默認時區和語言環境獲得一個日歷。
static Calendar getInstance(Locale aLocale)
使用默認時區和指定語言環境獲得一個日歷。
static Calendar getInstance(TimeZone zone)
使用指定時區和默認語言環境獲得一個日歷。
static Calendar getInstance(TimeZone zone, Locale aLocale)
使用指定時區和語言環境獲得一個日歷。
abstract int getLeastMaximum(int field)
返回此 Calendar 實例給定日歷欄位的最低的最大值。
abstract int getMaximum(int field)
返回此 Calendar 實例給定日歷欄位的最大值。
int getMinimalDaysInFirstWeek()
獲取一年中第一個星期所需的最少天數,例如,如果定義第一個星期包含一年第一個月的第一天,則此方法將返回 1。
abstract int getMinimum(int field)
返回此 Calendar 實例給定日歷欄位的最小值。
Date getTime()
返回一個表示此 Calendar 時間值(從歷元至現在的毫秒偏移量)的 Date 對象。
long getTimeInMillis()
返回此 Calendar 的時間值,以毫秒為單位。
TimeZone getTimeZone()
獲得時區。
int hashCode()
返回該此日歷的哈希碼。
protected int internalGet(int field)
返回給定日歷欄位的值。
boolean isLenient()
判斷日期/時間的解釋是否為寬松的。
boolean isSet(int field)
確定給定日歷欄位是否已經設置了一個值,其中包括因為調用 get 方法觸發內部欄位計算而導致已經設置該值的情況。
abstract void roll(int field, boolean up)
在給定的時間欄位上添加或減去(上/下)單個時間單元,不更改更大的欄位。
void roll(int field, int amount)
向指定日歷欄位添加指定(有符號的)時間量,不更改更大的欄位。
void set(int field, int value)
將給定的日歷欄位設置為給定值。
void set(int year, int month, int date)
設置日歷欄位 YEAR、MONTH 和 DAY_OF_MONTH 的值。
void set(int year, int month, int date, int hourOfDay, int minute)
設置日歷欄位 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值。
void set(int year, int month, int date, int hourOfDay, int minute, int second)
設置欄位 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值。
void setFirstDayOfWeek(int value)
設置一星期的第一天是哪一天;例如,在美國,這一天是 SUNDAY,而在法國,這一天是 MONDAY。
void setLenient(boolean lenient)
指定日期/時間解釋是否是寬松的。
void setMinimalDaysInFirstWeek(int value)
設置一年中第一個星期所需的最少天數,例如,如果定義第一個星期包含一年第一個月的第一天,則使用值 1 調用此方法。
void setTime(Date date)
使用給定的 Date 設置此 Calendar 的時間。
void setTimeInMillis(long millis)
用給定的 long 值設置此 Calendar 的當前時間值。
void setTimeZone(TimeZone value)
使用給定的時區值來設置時區。
String toString()
返回此日歷的字元串表示形式。
㈧ Java中解釋一些日歷類(CalendarClass)中的重要方法
Calendar類(理解)
Calendar類是採用手工的方式取得日期,可以通過此類精確到毫秒,此類的定義如下:
public abstract class Calendar extends Object
implements Serializable, Cloneable, Comparable<Calendar>
這個類本身是一個抽象類,抽象類要想實例化肯定使用子類:GregorianCalendar
package org.lxh.api.datedemo;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class CalendarDemo {
public static void main(String[] args) {
Calendar calendar = new GregorianCalendar();
System.out.println("YEAR: " + calendar.get(Calendar.YEAR));
System.out.println("MONTH: " + (calendar.get(Calendar.MONTH) + 1));
System.out.println("DATE: " + calendar.get(Calendar.DATE));
System.out
.println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY));
System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE));
System.out.println("SECOND: " + calendar.get(Calendar.SECOND));
System.out
.println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND));
}
}
但是現在有一個問題,如果每次取時間都按照這種方式取的話,那麼得累死,那麼能不能設計一個類,可以通過此
類直接取得時間呢,例如:現在給出了如下的一個介面:
package org.lxh.api.datedemo;
public interface DateTime {
/**
*取得日期
* @return 日期的字元串,例如:2009-12-22
*/
public String getDate() ;
/**
*取得日期時間
* @return 日期時間的字元串,例如:2009-12-22 11:06:23.345
*/
public String getDateTime() ;
/**
*取得時間戳
* @return 返回時間戳的字元串,例如:20091222110623345
*/
public String getTimeStamp() ;
}
前面需要補0的問題需要注意,例如:01。
package org.lxh.api.datedemo;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class DateTimeImpl implements DateTime {
private Calendar calendar;
public DateTimeImpl() {
this.calendar = new GregorianCalendar();
}
public String getDate() {
StringBuffer buf = new StringBuffer();
buf.append(calendar.get(Calendar.YEAR)).append("-");
buf.append(this.addZero((calendar.get(Calendar.MONTH) + 1), 2)).append("-");
buf.append(this.addZero(calendar.get(Calendar.DATE), 2));
return buf.toString();
}
public String getDateTime() {
StringBuffer buf = new StringBuffer();
buf.append(calendar.get(Calendar.YEAR)).append("-");
buf.append(this.addZero((calendar.get(Calendar.MONTH) + 1), 2)).append("-");
buf.append(this.addZero(calendar.get(Calendar.DATE), 2)).append(" ");
buf.append(this.addZero(calendar.get(Calendar.HOUR_OF_DAY), 2)).append(":") ;
buf.append(this.addZero(calendar.get(Calendar.MINUTE), 2)).append(":") ;
buf.append(this.addZero(calendar.get(Calendar.SECOND), 2)).append(".") ;
buf.append(this.addZero(calendar.get(Calendar.MILLISECOND), 3)) ;
return buf.toString();
}
@Override
public String getTimeStamp() {
StringBuffer buf = new StringBuffer();
buf.append(calendar.get(Calendar.YEAR));
buf.append(this.addZero((calendar.get(Calendar.MONTH) + 1), 2));
buf.append(this.addZero(calendar.get(Calendar.DATE), 2));
buf.append(this.addZero(calendar.get(Calendar.HOUR_OF_DAY), 2));
buf.append(this.addZero(calendar.get(Calendar.MINUTE), 2)) ;
buf.append(this.addZero(calendar.get(Calendar.SECOND), 2)) ;
buf.append(this.addZero(calendar.get(Calendar.MILLISECOND), 3)) ;
return buf.toString();
}
private String addZero(int num, int len) {
StringBuffer buf = new StringBuffer();
buf.append(num);
while (buf.length() < len) {
buf.insert(0, 0);
}
return buf.toString();
}
}
㈨ Java里的Calendar類
set(int field, int value) 將日歷欄位 field 更改為 value。此外,它設置了一個內部成員變數,以指示日歷欄位 field 已經被更改。盡管日歷欄位 field 是立即更改的,但是直到下次調用 get()、getTime()、getTimeInMillis()、add() 或 roll() 時才會重新計算日歷的時間值(以毫秒為單位)。因此,多次調用 set() 不會觸發多次不必要的計算。使用 set() 更改日歷欄位的結果是,其他日歷欄位也可能發生更改,這取決於日歷欄位、日歷欄位值和日歷系統。此外,在重新計算日歷欄位之後,get(field) 沒必要通過調用 set 方法返回 value 集合。具體細節是通過具體的日歷類確定的。
示例:假定 GregorianCalendar 最初被設置為 1999 年 8 月 31 日。調用 set(Calendar.MONTH, Calendar.SEPTEMBER) 將該日期設置為 1999 年 9 月 31 日。如果隨後調用 getTime(),那麼這是解析 1999 年 10 月 1 日的一個暫時內部表示。但是,在調用 getTime() 之前調用 set(Calendar.DAY_OF_MONTH, 30) 會將該日期設置為 1999 年 9 月 30 日,因為在調用 set() 之後沒有發生重新計算。
補充:應該沒錯!