Java核心類庫 - 時間Date和Calendar
時間日期
1)java中的時間類有:Date和Calendar
2)java中時間類的本質 long(毫秒數)
Date = long +歷法算法(方法gerYear())
Calendar = long +歷法算法(方法ger())
3) 時間的標準有兩種
(1970)GMT long
(0)UTC long
4) java中基本的時間表示GMT long
5) java提供了Date類型表示時間和日期
Date 是long 類型的包裝
6) Calendar 是歷法的抽象
歷法:公歷,農歷,太陽歷
7) GregorianCalendar是歷法的實現,采用公歷的算法實現的
Calendar cal = Calendar.getInstance();
Calendar cal = new GregorianCalendar();//除了日本和泰國,效果等同于上一句
8) Date和 Calendar的默認值就是系統當前時間
一 java中表示時間的方式:
1) 格林威治時間(GMT):1970年1月1日 00:00:00(注:中國是東八區,所以要+8個小時)
也就是1970年1月1日 08:00:00
2 )公元元年(UTC): 0年
3 )目前java中3種日期表達方式long, Date , Calendar都在用
例子
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class LongDateDemo {
public static void main(String[] args) {
long now = System.currentTimeMillis();
long year = now/1000/60/60/24/365 +1970;
System.out.println(year);
//一年 地球繞太陽一圈(365天+1/4天)
//原點(公元元年)
/* date.getYear()是將date內部的long時間,根據歷法計算
* 為年份,返回值是2位數年份,如:1997年返回97,但是過了
* 2K年,返回3位數年份,如2012返回112
*/
//老板本
Date date = new Date();//默認是當前時間(long)
int y = date.getYear()+1900;
int month = date.getMonth()+1;
System.out.println(y+"年"+month+"月");
//新版本
//Calendar 歷法
Calendar cal = new GregorianCalendar();//默認是當前時間(long)
y = cal.get(Calendar.YEAR);//2012
month = cal.get(Calendar.MONTH)+1;//4
System.out.println(y+"年"+month+"月");
}
}二 時間類型轉換 long <-> Date <-> Calendarlong --->Date : dat = new Date(l)
dat.setTime(l)
Date --->Calendar : cal.setTime(dat)
Calendar ---> Date: cal.getTime()
Date ---> long :dat.getTime()
注:Date dat , long l ,Calendar cal
例子
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
/**
* 時間的類型轉換
*/
public class DateCaseDemo {
public static void main(String[] args) {
long gmt = 0;//格林威治時間 1970/01/01
Date date = new Date();
date.setTime(gmt);//回到1970 元旦,相當于long -->Date
System.out.println(date.getYear()+1900);//1970
Calendar cal = new GregorianCalendar();
//date --> cal
cal.setTime(date);//將cal設置為date的時間,也是1970
System.out.println(cal.get(Calendar.YEAR));//1970
//date 和 cal ,gmt 代表同一時刻
//加-1天,是在當前時間上加-1天,就是減少1天,就是減少1天的毫秒數(1000*60*60*24)
cal.add(Calendar.DAY_OF_YEAR,-1);
Date d = cal.getTime();
System.out.println(d);//1969
long l = d.getTime();
System.out.println(l);//-86400000,因為是在原點以前的時間
}
}
三 時間的輸入與輸出
1) 日期輸出的本質是將Date轉換為格式化的String
2) 日期輸入的本質是將格式化的 String轉換為 Date
3) SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
構建SimpleDateFormat 一般提供日期的格式"yyyy-MM-dd"具體參看javadoc
如:"yyyy-MM-dd HH:mm:ss"
"yyyyMMdd"
"dd/MM/yy"
"MM/dd/yyyy"
常用方法
fmt.parse(String) 可以實現將(合法)字符串解析為日期類型,經常用于處理日期輸入
fmt.format(Date) 可以把日期格式化為字符串用于輸出處理
使用字符串String輸出時間
Date ---> String:
DateFormat fmt = new SimpleDateFormat("HH:mm:ss");
fmt.format(date)
把字符串String時間轉為Date時間(個是必須相同)
String --> Date :
DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
fmt.parse("1999-2-2")
注:java沒有提供String直接轉換為Calendar的API方法,但第三方提供的API有這種方法
如果Calendar需要轉為String,必須先轉換為Date
Calendar ----> Date :
Date dat = cal.getTime();
例子
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateIODemo {
public static void main(String[] args) throws ParseException {
Date date = new Date();//當前時間,當前毫秒數
//輸出yyyy-MM-dd HH:mm:ss
SimpleDateFormat fmt =
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//將日期類型格式化為時間字符串
String str = fmt.format(date);//日期格式化
System.out.println(str);//2012-12-21 00:00:00
//解析日期字符串為日期類型對象
String day = "2012-12-21";
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
Date d = f.parse(day);//將日期字符串解析為毫秒數
long l = d.getTime();
System.out.println(fmt.format(d));
String s = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
System.out.println(s);//2012-04-18
}
}
四 時間的計算
時間計算的問題
1) 本質是時間毫秒數的計算
2) 簡單時間計算,直接計算毫秒數,如:3天以后,2小時等
3) 復雜時間計算,利用Calender類提供的歷法算法實現
常用方法:
add() set()
Calendar 提供的方法本是上也是計算毫秒數,
例子
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class DateCalDemo {
public static void main(String[] args) {
//簡單時間計算
long l = System.currentTimeMillis();//當前時間
l += 1000L*60*60*24*3;//3天以后
SimpleDateFormat sdm = new SimpleDateFormat("yyyy-MM-dd");
String s = sdm.format(new Date(l));
System.out.println(s);
//復雜時間計算
Calendar cal = new GregorianCalendar();
cal.add(Calendar.YEAR, 2);//2年以后
cal.set(Calendar.MONTH,Calendar.JANUARY);//設置月份為1月
System.out.println(sdm.format(cal.getTime()));//2年以后的1月
}
}
例子2
package com.tarena.day16;
import java.util.Calendar;
import java.util.Date;
public class SpecialDateDemo {
public static void main(String[] args) {
}
/**
* 計算商品的促銷日期special Date,規則:商品過期前兩周五促銷
* @param creat
* @param months
* @return
*/
public static Date special(Date creat,int months){
Calendar cal = Calendar.getInstance();
cal.setTime(creat); //生產日期
cal.add(Calendar.MONTH, months); //過期日
cal.add(Calendar.WEEK_OF_YEAR, -2); //回調2周
if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY){//如果是星期天
cal.add(Calendar.WEEK_OF_YEAR, -1);//回調一周
cal.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);//調到本周的周五
}
return cal.getTime();
}
}
轉自:http://www.cnblogs.com/hqr9313/archive/2012/04/19/2458221.html