這兩周時間的Java開發讓我感覺到JAVA語言確實把一些簡單的事情搞得很復雜,比如日期時間處理,或許是考慮不同時區國際化跨平台之類的因素,但JAVA語言處理確實讓我很困惑,相信身邊好多開發的同事也如此,只是簡單知道有這些概念,遇到具體問題還需要上網查找,剛沒事上網搜索了Java時間處理、api相關主題,基本沒有多少滿意結果,就暫時將覺得好的、讓我有些收獲的記錄下來,以后遇到具體問題時再借助網絡資源解決。
Calendar是一個抽象類----專門獲取一個時間點的DAY,MONTH,YEAR,一年中的第幾天,星期幾,一個月中的第幾天等等
Calendar rightNow = Calendar.getInstance()可獲得一個Calendar (將當前時間點封裝成一個Calendar對象)
java.util.Date類 子類Calendar是一個抽象類----專門獲取一個時間點的DAY,MONTH,YEAR,一年中的第幾天,星期幾,一個月中的第幾天等等
Calendar rightNow = Calendar.getInstance()可獲得一個Calendar (將當前時間點封裝成一個Calendar對象)
用java.util.Date的三個子類java.sql.Date/java.sql.Time/java.sql.Timestamp處理
------------java.sql.Date 只存日期(年月日)
------------java.sql.Time 只存時間(時分秒 毫秒???)
------------java.sql.Timestamp(時間點):包括日期和時間兩部分(年月日時分秒.納秒)
——————————————————————————————————————————————————————
1.UTC/UT
世界標准時間
2.GMT
格林威治時間---1970 年 1 月 1 日 00:00:00(貌似和世界標准時間是一回事)
3.how to get the current time
1)System.currentTimeMillis-----返回當前時間點的毫秒表示,一般用於記錄程序的運行時間
2)Date date = new Date();
3)Calendar calendar = Calendar.getInstance();
4.how to format it
日期的格式化(比如年月日的格式---年/月/日或年-月-日)要使用(java.text包中)抽象類DateFormat的子類
SimpleDateFormat
new SimpleDateFormat("日期格式")---->MM是月份,mm是分;HH是24小時制,而hh是12小時制
5.how to convert a string to a date/time
方法一:
1)已知str="2012,12,21",new SimpleDateFormat("yyyy,MM,dd")----->創建要解析字符串為日期的格式
2)sdf.parse(str)--->返回字符串對應的Date------->SimpleDateFormat除了格式化Date為字符串外,還能把字符串
按格式解析為Date
方法二:
1)先將字符串轉為"yyyy-mm-dd hh:mm:ss.0(納秒)"的格式
2)調用Timestamp t = new Timestamp().valueOf(str);(Timestamp的靜態方法,util.Date.parse方法已過時..)
6.how to process the date/time with database
用java.util.Date的三個子類java.sql.Date/java.sql.Time/java.sql.Timestamp處理
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT+08:00")); //獲取東八區時間
int year = c.get(Calendar.YEAR); //獲取年
int month = c.get(Calendar.MONTH) + 1; //獲取月份,0表示1月份
int day = c.get(Calendar.DAY_OF_MONTH); //獲取當前天數
int first = c.getActualMinimum(c.DAY_OF_MONTH); //獲取本月最小天數
int last = c.getActualMaximum(c.DAY_OF_MONTH); //獲取本月最大天數
int time = c.get(Calendar.HOUR_OF_DAY); //獲取當前小時
int min = c.get(Calendar.MINUTE); //獲取當前分鍾
int xx = c.get(Calendar.SECOND); //獲取當前秒
SimpleDateFormat s=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String curDate = s.format(c.getTime()); //當前日期
Date d2 = new Date();
//年份
int year = d2.getYear() + 1900;
//月份
int month = d2.getMonth() + 1;
//日期
int date = d2.getDate();
//小時
int hour = d2.getHours();
//分鍾
int minute = d2.getMinutes();
//秒
int second = d2.getSeconds();
//星期幾
int day = d2.getDay();
使用Date類中對應的get方法,可以獲得Date類對象中相關的信息,需要注意的是使用getYear獲得是Date對象中年份減去1900以后的值,所以需要顯示對應的年份則需要在返回值的基礎上加上1900,月份類似。在Date類中還提供了getDay方法,用於獲得Date對象代表的時間是星期幾,Date類規定周日是0,周一是1,周二是2,后續的依次類推。
//將Date類的對象轉換為相對時間
long t = d3.getTime();
System.out.println(t);
//將相對時間轉換為Date類的對象
Date d4 = new Date(time);
System.out.println(d4);
使用Date對象中的getTime方法,可以將Date類的對象轉換為相對時間,使用Date類的構造方法,可以將相對時間轉換為Date類的對象。經過轉換以后,既方便了時間的計算,也使時間顯示比較直觀了。
從JDK1.1版本開始,在處理日期和時間時,系統推薦使用Calendar類進行實現。在設計上,Calendar類的功能要比Date類強大很多,而且在實現方式上也比Date類要復雜一些,下面就介紹一下Calendar類的使用。
Calendar類是一個抽象類,在實際使用時實現特定的子類的對象,創建對象的過程對程序員來說是透明的,只需要使用getInstance方法創建即可。
public final Date getTime()
方法的作用是將Calendar類型的對象轉換為對應的Date類對象,兩者代表相同的時間點。
類似的方法是setTime,該方法的作用是將Date對象轉換為對應的Calendar對象,該方法的聲明如下:
public final void setTime(Date date)
轉換的示例代碼如下:
Date d = new Date();
Calendar c6 = Calendar.getInstance();
//Calendar類型的對象轉換為Date對象
Date d1 = c6.getTime();
//Date類型的對象轉換為Calendar對象
Calendar c7 = Calendar.getInstance();
c7.setTime(d);
//將Calendar對象轉換為相對時間
long t1 = c8.getTimeInMillis();
//將相對時間轉換為Calendar對象
Calendar c9 = Calendar.getInstance();
c9.setTimeInMillis(t1);
/**
* 計算兩個日期之間相差的天數
*/
public class DateExample1 {
public static void main(String[] args) {
//設置兩個日期
//日期:2009年3月11號
Calendar c1 = Calendar.getInstance();
c1.set(2009, 3 - 1, 11);
//日期:2010年4月1號
Calendar c2 = Calendar.getInstance();
c2.set(2010, 4 - 1, 1);
//轉換為相對時間
long t1 = c1.getTimeInMillis();
long t2 = c2.getTimeInMillis();
//計算天數
long days = (t2 - t1)/(24 * 60 * 60 * 1000);
System.out.println(days);
}
}
import java.util.*;
/**
* 輸出當前月的日歷
*/
public class DateExample2{
public static void main(String[] args){
//獲得當前時間
Calendar c = Calendar.getInstance();
//設置代表的日期為1號
c.set(Calendar.DATE,1);
//獲得1號是星期幾
int start = c.get(Calendar.DAY_OF_WEEK);
//獲得當前月的最大日期數
int maxDay = c.getActualMaximum(Calendar.DATE);
//輸出標題
System.out.println("星期日 星期一 星期二 星期三 星期四 星期五 星期六");
//輸出開始的空格
for(int i = 1;i < start;i++){
System.out.print(" ");
}
//輸出該月中的所有日期
for(int i = 1;i <= maxDay;i++){
//輸出日期數字
System.out.print(" " + i);
//輸出分隔空格
System.out.print(" ");
if(i < 10){
System.out.print(' ');
}
//判斷是否換行
if((start + i - 1) % 7 == 0){
System.out.println();
}
}
//換行
System.out.println();
}
}