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 <-> Calendar
long --->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