java.util.Calendar 月曆類
Calendar是一個抽象類,規定了操作日期的相關方法。
由于不同的日期曆法對日期的計算不同,需要靠不同的子類去實作這些方法。
常用的實作類:java.util.GregorianCalendar,即 陽曆
Calendar提供了一個靜态方法:getInstance()可以擷取一個目前系統所在地區适用的實作類,大部分擷取的都是陽曆實作類。
Calendar calendar = Calendar.getInstance();
/*
* toString可讀性差
*/
System.out.println(calendar);
Calendar提供了一個可以轉換為Date的方法:
Date getTime() //将目前Calendar表示的時間以Date形式傳回。
Date date = calendar.getTime();
System.out.println(date);
也提供了一個可以讓Calendar表示指定日期的方法:
void setTime(Date date)
是目前Calendar表示給定的Date所表示的日期
Calendar的get方法
int get(int field) //該方法可以擷取指定的時間分量所對應的值。
時間分量是一個int值,不同值表示不同時間分量,無需記憶這些數具體是多少,Calendar提供了對應的常量。
Calendar calendar = Calendar.getInstance();
//擷取年
int year = calendar.get(Calendar.YEAR);
//擷取月 月從0開始
int month = calendar.get(Calendar.MONTH)+1;
/*
* 擷取日
* 和"天"相關的常量有:
* DAY_OF_MONTH:月中的天,就是俗稱的"幾号"
* DAY_OF_WEEK:周中的天,就是指星期幾
* DAY_OF_YEAR:年中的天。
* DATE:與DAY_OF_MONTH意義相同。
*/
int date = calendar.get(Calendar.DATE);
System.out.println(year+"-"+month+"-"+date);
int h = calendar.get(Calendar.HOUR_OF_DAY);
int m = calendar.get(Calendar.MINUTE);
int s = calendar.get(Calendar.SECOND);
System.out.println(h+":"+m+":"+s);
/*
* 根據目前Calendar表示的日期擷取指定時間分量
* 所允許的最大值
* 今年總共多少天?
*/
int days = calendar.getActualMaximum(
Calendar.DAY_OF_YEAR
);
System.out.println("今年共:"+days+"天");
Calendar的add方法
void add(int field,int amount)
對給定的時間分量加上指定的值,若給定的值為負數則是減去。
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime());
/*
* 檢視3年2個月零25天以後所在周的周三是哪天?
*/
//加3年
calendar.add(Calendar.YEAR, 3);
//加2個月
calendar.add(Calendar.MONTH, 2);
//加25天
calendar.add(Calendar.DAY_OF_YEAR, 25);
System.out.println(calendar.getTime());
calendar.set(Calendar.DAY_OF_WEEK, 4);
System.out.println(calendar.getTime());
Calendar的set方法
可以對指定時間分量設定對應的值:
void set(int field,int value)
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime());
/*
* 設定Calendar為2008-08-08 20:08:08
*/
//設定年
calendar.set(Calendar.YEAR, 2008);
//設定月
calendar.set(Calendar.MONTH, Calendar.AUGUST);
//設定日
calendar.set(Calendar.DAY_OF_MONTH,8);
calendar.set(Calendar.HOUR_OF_DAY,20);
calendar.set(Calendar.MINUTE,8);
calendar.set(Calendar.SECOND,8);
System.out.println(calendar.getTime());
/*
* 設定為周4
* 按照西方的标準,一周的第一天為周日
*/
calendar.set(Calendar.DAY_OF_WEEK, 5);
System.out.println(calendar.getTime());
java.util.Date
Date的每一個執行個體用于表示一個确切的時間。内部維護的一個long值,該值為1970年1月1日 00:00:00到目前
Date所表示的時間之間所經過的毫秒。
由于Date設計時存在時區問題,是以大部分操作時間的方法都被聲明為過時的,不再建議使用。
//預設執行個體化表示目前系統時間
Date date = new Date();
System.out.println(date);
//擷取Date内部維護的long值
long time = date.getTime();
time += 1000*60*60*24;
//可以設定一個long指使Date表示該日期
date.setTime(time);
System.out.println(date);
SimpleDateFormat的format 将給定的Date按照目前SDF指定的日期格式轉換為對應内容的字元串
Date date = new Date();
System.out.println(date);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//String format(Date date)将給定的Date按照目前SDF指定的日期格式轉換為對應内容的字元串
String str = sdf.format(date);
System.out.println(str);
SimpleDateFormat的parse将一個字元串按照對應的日期格式解析為Date 需要抛異常
public static void main(String[] args) throws ParseException {
String str = "2008-08-08 20:08:08";
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse(str);
System.out.println(date);
}
輸入自己的生日,然後經過程式計算,輸出到今天為止一共活了多少天
例如:
1992-08-02
計算後輸出到今天為止共活了xxxx天
再輸出出生10000天的紀念日為哪天?
格式還是:yyyy-MM-dd
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入您的生日:");
String birthStr = scanner.nextLine();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date birth = sdf.parse(birthStr);
Date now = new Date();
long time = now.getTime()-birth.getTime();
//換算成天
time = time/1000/60/60/24;
System.out.println("恭喜您!一共活了"+time+"天,請繼續保持!");
//計算10000天紀念日
time = birth.getTime()+1000L*60*60*24*10000;
Date date = new Date(time);
String str = sdf.format(date);
System.out.println("您出生10000天的紀念日為:"+str);
計算商品促銷日期
促銷日計算規則:該商品過期日前兩周的周三
程式啟動後,要求使用者輸入商品的生産日期,格式為:yyyy-MM-dd
然後再輸入保存期限的天數
然後經過計算,輸出該商品促銷日期,輸出的格式是:yyyy-MM-dd
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入生産日期:");
String dateStr = scanner.nextLine();
System.out.println("請輸入保存期限天數:");
int days = Integer.parseInt(scanner.nextLine());
//得到生産日期的Date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse(dateStr);
Calendar calendar = Calendar.getInstance();
//讓Calendar表示生産日期
calendar.setTime(date);
//計算過期日
calendar.add(Calendar.DAY_OF_YEAR, days);
//減去2周
calendar.add(Calendar.DAY_OF_YEAR, -14);
//設定為當周的周三
calendar.set(Calendar.DAY_OF_WEEK, 4);
date = calendar.getTime();
String str = sdf.format(date);
System.out.println("促銷日為:"+str);
兩個字元創類型的時間進行比較
//目前時間與過期時間進行比較
public static boolean warnning(String day,String period) throws ParseException{
int month = Integer.parseInt(period);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse(day);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
//加上周期(月),為到期日
calendar.add(Calendar.MONTH, month);
//設定為過期日的前15天
calendar.add(Calendar.DAY_OF_YEAR, -15);
//擷取提醒的時間
date = calendar.getTime();
//提醒時間字元串
String time = sdf.format(date);
Date d = new Date();
//目前時間字元串
String now = sdf.format(d.getTime());
//比較時間
int result = time.compareTo(now);
if(result>=0){
//到了提醒時間
return true;
}else{
//沒到提醒時間
return false;
}
}