時間日期
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都在用
1 例子 2 import java.util.Calendar; 3 import java.util.Date; 4 import java.util.GregorianCalendar; 5 6 public class LongDateDemo { 7 public static void main(String[] args) { 8 long now = System.currentTimeMillis(); 9 long year = now/1000/60/60/24/365 +1970; 10 System.out.println(year); 11 //一年 地球繞太陽一圈(365天+1/4天) 12 //原點(公元元年) 13 14 /* date.getYear()是將date內部的long時間,根據歷法計算 15 * 為年份,返回值是2位數年份,如:1997年返回97,但是過了 16 * 2K年,返回3位數年份,如2012返回112 17 */ 18 19 //老板本 20 Date date = new Date();//默認是當前時間(long) 21 int y = date.getYear()+1900; 22 int month = date.getMonth()+1; 23 System.out.println(y+"年"+month+"月"); 24 25 //新版本 26 //Calendar 歷法 27 Calendar cal = new GregorianCalendar();//默認是當前時間(long) 28 y = cal.get(Calendar.YEAR);//2012 29 month = cal.get(Calendar.MONTH)+1;//4 30 System.out.println(y+"年"+month+"月"); 31 32 33 } 34 35 }
二 時間類型轉換 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
例子
1 import java.util.Calendar; 2 import java.util.Date; 3 import java.util.GregorianCalendar; 4 5 /** 6 * 時間的類型轉換 7 */ 8 public class DateCaseDemo { 9 public static void main(String[] args) { 10 long gmt = 0;//格林威治時間 1970/01/01 11 12 Date date = new Date(); 13 date.setTime(gmt);//回到1970 元旦,相當於long -->Date 14 System.out.println(date.getYear()+1900);//1970 15 16 Calendar cal = new GregorianCalendar(); 17 //date --> cal 18 cal.setTime(date);//將cal設置為date的時間,也是1970 19 System.out.println(cal.get(Calendar.YEAR));//1970 20 //date 和 cal ,gmt 代表同一時刻 21 //加-1天,是在當前時間上加-1天,就是減少1天,就是減少1天的毫秒數(1000*60*60*24) 22 cal.add(Calendar.DAY_OF_YEAR,-1); 23 Date d = cal.getTime(); 24 System.out.println(d);//1969 25 long l = d.getTime(); 26 System.out.println(l);//-86400000,因為是在原點以前的時間 27 28 29 } 30 31 }
三 時間的輸入與輸出
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();
例子
1 import java.text.ParseException; 2 import java.text.SimpleDateFormat; 3 import java.util.Date; 4 5 public class DateIODemo { 6 public static void main(String[] args) throws ParseException { 7 Date date = new Date();//當前時間,當前毫秒數 8 //輸出yyyy-MM-dd HH:mm:ss 9 SimpleDateFormat fmt = 10 new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 11 //將日期類型格式化為時間字符串 12 String str = fmt.format(date);//日期格式化 13 System.out.println(str);//2012-12-21 00:00:00 14 //解析日期字符串為日期類型對象 15 String day = "2012-12-21"; 16 SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd"); 17 Date d = f.parse(day);//將日期字符串解析為毫秒數 18 long l = d.getTime(); 19 System.out.println(fmt.format(d)); 20 String s = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); 21 System.out.println(s);//2012-04-18 22 } 23 24 }
四 時間的計算
時間計算的問題
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(); } }
