java中日期的調用,Date和Calendar的轉換


Date和Calendar是Java類庫裏提供對時間進行處理的類,由於日期在商業邏輯的應用中佔據着很重要的地位,所以在這裏想對這兩個類進行一個基本的講解,由於技術有限,不到之處請指正。 
Date類顧名思義,一看就知道是和日期有關的類了,這個類最主要的作用就是獲得當前時間了,然而這個類裏面也具有設置時間以及一些其他的功能,可是由於本身設計的問題,這些方法卻遭到衆多批評,而這些遭受批評的功能都已移植到另外一個類裏面,這就是今天要講到的第二個類Calendar裏面。 
在講兩個類之前,這裏又不能不多提一個類,那就是DateFormat類,這個類是用來格式化日期的,稍後也會講到。 
首先,讓我們來看一個獲取當前時間的例子: 
Date date = new Date();
System.out.println(date.getTime());上面的語句首先創建了Date的一個對象,接着使用getTime方法獲得當前的時間,但是注意了,輸出後的結果確實一串長整型的數字,這是爲什麼?實際上這是系統根據當前時間計算出來的一個long型的數,至於是如何計算出來的就不在本文中講述了,那既然這樣的話又如何顯示正確的時間呢?這就要利用到上面的DateFormat類了,這個類是一個基類,它有一個子類是SimpleDateFormat,具體用法請看下面的代碼: 
Date date = new Date();
SimpleDateFormat dateFm = new SimpleDateFormat("EEEE-MMMM-dd-yyyy");
System.out.println(dateFm.format(date));這段代碼開始創建了一個Date的對象,用來獲取當前時間,而重點就在於後面的SimpleDateFormat對象,這個對繼承了DateFormat,利用format方法對Date對象進行格式化,然後輸出,而格式的定製是由用戶定製的,EEEE代表星期,MMMM代表月份,而dd代表日,yyyy代表年。使用這個方法就可以根據用戶自定義的格式進行輸出時間。 
上面介紹了由用戶自定義格式的輸出時間,下面將來介紹通過JAVA類庫提供的標準格式輸出時間,這就要用到DateFormat類了,請看以下代碼: 
Date date = new Date();
DateFormat dateFm = DateFormat.getDateTimeInstance(DateFormat.SHORT,
DateFormat.SHORT);
System.out.println(dateFm.format(date));這裏使用的方法和用戶自定義的方法差不多,只是這裏使用的是一個抽象類,由於DateFormat是一個抽象類,所以它不能通過構造函數構造對象,在這裏是通過getDateTimeInstance()方法獲得該對象,而所傳遞的參數就是DateFormat裏面定義的一些常量,系統根據這些常量輸出當前時間,由於這裏使用的是getDateTimeInstance方法,所以將傳遞兩個常量參數,用來分別格式化日期和當前的時間。 
上面講述瞭如何獲得系統時間以及如何格式化輸出,那如果想獲取或者設置時間當中的某一部分又該如何呢?例如年,月,日。這就要靠Calendar這個類了,這個類也是一個抽象類,它有一個子類GregorianCalendar,接下來我會利用這個子類來演示這個過程,請看以下代碼:

DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL);
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(new Date());
System.out.println("System Date: " + dateFormat.format(cal.getTime()));
cal.set(GregorianCalendar.DAY_OF_WEEK,GregorianCalendar.FRIDAY);
System.out.println("After Setting Day of Week to Friday: " +
dateFormat.format(cal.getTime()));
這段代碼當中,首先創建了一個DateFormat對象進行格式設置,接着創建了一個GregorianCalendar對象cal,接着使用cal.setTime()方法設置cal對象中的時間爲當前時間,然後通過format格式化由cal.getTime()返回的時間進行輸出,後面利用set方法設置cal的日期爲當前星期的FRIDAY,此時cal中存儲的時間就是這個星期五的該時刻,而後面利用format格式化輸出,假如當前時間爲2005年1月27日星期4的11點30分,那麼最後將那句將會輸出2005年1月28日星期5的11點30分。


在JDK 1.1後,java.util.Date 類型的大多數方法已經不推薦使用了。代替它的是Calendar。

而在java.sql.Date 和 java.util.Date之間,有些微妙的關係。

如何將Date類型插入數據庫中,成爲好多人的一個不小的障礙。

我們將討論下面的類:

1、具體類(和抽象類相對)java.util.Date 
2、抽象類java.text.DateFormat 和它的一個具體子類,java.text.SimpleDateFormat 
3、抽象類java.util.Calendar 和它的一個具體子類,java.util.GregorianCalendar

具體類可以被實例化, 但是抽象類卻不能. 你首先必須實現抽象類的一個具體子類.

Date 類從Java 開發包(JDK) 1.0 就開始進化, 當時它只包含了幾個取得或者設置一個日期數據的各個部分的方法, 比如說月, 日, 和年. 這些方法現在遭到了批評並且已經被轉移到了Calendar類裏去了, 我們將在本文中進一步討論它. 這種改進旨在更好的處理日期數據的國際化格式. 就象在JDK 1.1中一樣, Date 類實際上只是一個包裹類, 它包含的是一個長整型數據, 表示的是從GMT(格林尼治標準時間)1970年, 1 月 1日00:00:00這一刻之前或者是之後經歷的毫秒數.

一、創建一個日期對象r

讓我們看一個使用系統的當前日期和時間創建一個日期對象並返回一個長整數的簡單例子. 這個時間通常被稱爲Java 虛擬機(JVM)主機環境的系統時間. 
import java.util.Date;

public class DateExample1 { 
public static void main(String[] args) { 
// Get the system date/time 
Date date = new Date();

System.out.println(date.getTime()); 

}

在星期六, 2001年9月29日, 下午大約是6:50的樣子, 上面的例子在系統輸出設備上顯示的結果是 1001803809710. 在這個例子中,值得注意的是我們使用了Date 構造函數創建一個日期對象, 這個構造函數沒有接受任何參數. 而這個構造函數在內部使用了System.currentTimeMillis() 方法來從系統獲取日期.

那麼, 現在我們已經知道了如何獲取從1970年1月1日開始經歷的毫秒數了. 我們如何才能以一種用戶明白的格式來顯示這個日期呢? 在這裏類java.text.SimpleDateFormat 和它的抽象基類 java.text.DateFormat 就派得上用場了.

二、日期數據的定製格式

假如我們希望定製日期數據的格式, 比方星期六-9月-29日-2001年. 下面的例子展示瞭如何完成這個工作:

import java.text.SimpleDateFormat; 
import java.util.Date;

public class DateExample2 {

public static void main(String[] args) {

SimpleDateFormat bartDateFormat = 
new SimpleDateFormat("EEEE-MMMM-dd-yyyy");

Date date = new Date();

System.out.println(bartDateFormat.format(date)); 

}

只要通過向SimpleDateFormat 的構造函數傳遞格式字符串"EEE-MMMM-dd-yyyy", 我們就能夠指明自己想要的格式. 你應該可以看見, 格式字符串中的ASCII 字符告訴格式化函數下面顯示日期數據的哪一個部分. EEEE是星期, MMMM是月, dd是日, yyyy是年. 字符的個數決定了日期是如何格式化的.傳遞"EE-MM-dd-yy"會顯示 Sat-09-29-01. 請察看Sun 公司的Web 站點獲取日期格式化選項的完整的指示.

三、將文本數據解析成日期對象r

假設我們有一個文本字符串包含了一個格式化了的日期對象, 而我們希望解析這個字符串並從文本日期數據創建一個日期對象. 我們將再次以格式化字符串"MM-dd-yyyy" 調用SimpleDateFormat類, 但是這一次, 我們使用格式化解析而不是生成一個文本日期數據. 我們的例子, 顯示在下面, 將解析文本字符串"9-29-2001"並創建一個值爲001736000000 的日期對象.

例子程序:

import java.text.SimpleDateFormat; 
import java.util.Date;

public class DateExample3 {

public static void main(String[] args) { 
// Create a date formatter that can parse dates of 
// the form MM-dd-yyyy. 
SimpleDateFormat bartDateFormat = 
new SimpleDateFormat("MM-dd-yyyy");

// Create a string containing a text date to be parsed. 
String dateStringToParse = "9-29-2001";

try { 
// Parse the text version of the date. 
// We have to perform the parse method in a 
// try-catch construct in case dateStringToParse 
// does not contain a date in the format we are expecting. 
Date date = bartDateFormat.parse(dateStringToParse);

// Now send the parsed date as a long value 
// to the system output. 
System.out.println(date.getTime()); 

catch (Exception ex) { 
System.out.println(ex.getMessage()); 


}

五、使用標準的日期格式化過程

既然我們已經可以生成和解析定製的日期格式了, 讓我們來看一看如何使用內建的格式化過程. 方法 DateFormat.getDateTimeInstance() 讓我們得以用幾種不同的方法獲得標準的日期格式化過程. 在下面的例子中, 我們獲取了四個內建的日期格式化過程. 它們包括一個短的, 中等的, 長的, 和完整的日期格式.

import java.text.DateFormat; 
import java.util.Date;

public class DateExample4 {

public static void main(String[] args) { 
Date date = new Date();

DateFormat shortDateFormat = 
DateFormat.getDateTimeInstance( 
DateFormat.SHORT, 
DateFormat.SHORT);

DateFormat mediumDateFormat = 
DateFormat.getDateTimeInstance( 
DateFormat.MEDIUM, 
DateFormat.MEDIUM);

DateFormat longDateFormat = 
DateFormat.getDateTimeInstance( 
DateFormat.LONG, 
DateFormat.LONG);

DateFormat fullDateFormat = 
DateFormat.getDateTimeInstance( 
DateFormat.FULL, 
DateFormat.FULL);

System.out.println(shortDateFormat.format(date)); 
System.out.println(mediumDateFormat.format(date)); 
System.out.println(longDateFormat.format(date)); 
System.out.println(fullDateFormat.format(date)); 

}

注意我們在對 getDateTimeInstance的每次調用中都傳遞了兩個值. 第一個參數是日期風格, 而第二個參數是時間風格. 它們都是基本數據類型int(整型). 考慮到可讀性, 我們使用了DateFormat 類提供的常量: SHORT, MEDIUM, LONG, 和 FULL. 要知道獲取時間和日期格式化過程的更多的方法和選項, 請看Sun 公司Web 站點上的解釋.

運行我們的例子程序的時候, 它將向標準輸出設備輸出下面的內容: 
9/29/01 8:44 PM 
Sep 29, 2001 8:44:45 PM 
September 29, 2001 8:44:45 PM EDT 
Saturday, September 29, 2001 8:44:45 PM EDT

當然,並不一定要在外部插入時間,因爲在數據庫中,可以讓它自動插入,比如:MSSQL裏面,用

getdate()來插入當前時間,而在Insert時,便可以不用管它了。但有的時候還是避免不了,要手工插入

時間,以更新數據庫。

六、java.util.Calendar 格式化時間

Calendar cal = new GregorianCalendar(); 
int year = cal.get(Calendar.YEAR); 
int month = cal.get(Calendar.MONTH)+1; 
int day = cal.get(Calendar.DAY_OF_MONTH); 
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); 
String week = ""; 
switch(dayOfWeek) { 
case 1: 
week = "星期天"; break; 
case 2: 
week = "星期一"; break; 
case 3: 
week = "星期二"; break; 
case 4: 
week = "星期三"; break; 
case 5: 
week = "星期四"; break; 
case 6: 
week = "星期五"; break; 
default: 
week = "星期六"; break;

int hour = cal.get(Calendar.HOUR_OF_DAY); // 24小時制 
// int hour = cal.get(Calendar.HOUR); // 12小時制 
int minute = cal.get(Calendar.MINUTE); 
int second = cal.get(Calendar.SECOND); 
String h,m,s; 
if(hour<10) h = "0"+hour; else h = hour+""; 
if(minute<10) m = "0"+minute; else m = minute+""; 
if(second<10) s = "0"+second; else s = second+"";

在JSP中輸出是:

今天是: 年月日 ::

結果: 今天是: 2006年4月14日星期五 05:35:26

2、在數據庫中插入時間

PreparedStatement ps = con.prepareStatement("insert into TableName(dAddTime) values(?)"); 
這裏有三種方式: 
1) ps.setDate(1,new java.sql.Date(System.currentTimemillis())); 
2) ps.setTime(2,new java.sql.Time(System.currentTimemillis())); 
3) ps.setTimestamp(3,new java.sql.Timestamp(System.currentTimemillis())); 
第一種只插入年月日 0000-00-00

常用格式的實現:

SimpleDateFormat formatterhwy=new SimpleDateFormat("yyyy-MM-dd"); 
java.util.Date syscurrentime=new java.util.Date(); 
String currentsysdate=formatterhwy.format(syscurrentime);

SimpleDateFormat myformatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
java.util.Date mycurrentime=new java.util.Date(); 
String mycurrentdate=myformatter.format(mycurrentime);

SimpleDateFormat formatterms=new SimpleDateFormat("yyyy-MM-dd HH:mm"); 
java.util.Date currentimems=new java.util.Date(); 
String currentdatems=formatterms.format(currentimems);

SimpleDateFormat formatterms1=new SimpleDateFormat("yyyyMMdd"); 
java.util.Date currentimems1=new java.util.Date(); 
String currentdatems1=formatterms1.format(currentimems1);

long today=System.currentTimeMillis(); 
java.util.Date todaytime=new java.util.Date(today); 
SimpleDateFormat formattertoday=new SimpleDateFormat("yyyy-MM-dd");//今天的日期 
String todaydate=formattertoday.format(todaytime);

long yestoday=today-86400000; 
java.util.Date yestodaytime=new java.util.Date(yestoday); 
SimpleDateFormat formatteryestoday=new SimpleDateFormat("yyyy-MM-dd");//昨天的日期 
String yestodaydate=formatteryestoday.format(yestodaytime);

long lasthour=today-3600000; 
java.util.Date lasthourtime=new java.util.Date(lasthour); 
SimpleDateFormat formattershour=new SimpleDateFormat("yyyy-MM-dd HH:00:00");//某天的上一個小時開始時間 
SimpleDateFormat formatterehour=new SimpleDateFormat("yyyy-MM-dd HH:59:59");//某天的上一個小時結束時間 
String lastshourdate=formattershour.format(lasthourtime); 
String lastehourdate=formatterehour.format(lasthourtime);

long fristday=System.currentTimeMillis(); //每月的第一天 
java.util.Date fristdaytime=new java.util.Date(fristday); 
SimpleDateFormat formatterfristday=new SimpleDateFormat("yyyy-MM-dd");//昨天的日期 
String fristdate=formatterfristday.format(fristdaytime);

if(fristdate.substring(fristdate.length()-2).equals("01")){ 
//是 
}

例子:

Calendar ca=Calendar.getInstance(); 
java.util.Date nowdate = new java.util.Date();//得到當前時間 
ca.setTime(nowdate); 
ca.set(Calendar.DAY_OF_YEAR, ca.get(Calendar.DAY_OF_YEAR)-1);//你想要前幾天的,就減去幾天 
Date now = new Date(ca.getTimeInMillis());//這個就是前n天的時間

public static String GetWeekSAndE(int year,int weeki){//返回周開始日期和結束日期 用逗號隔開 
String sdate=""; 
String edate=""; 
Calendar cal = Calendar.getInstance(); 
cal.clear(); 
cal.set(Calendar.YEAR, year); 
cal.set(Calendar.WEEK_OF_YEAR, weeki); 
cal.add(Calendar.DAY_OF_YEAR, 1); 
sdate=cal.get(Calendar.YEAR)+"-"+(cal.get(Calendar.MONTH)+1)+"-"+cal.get(Calendar.DATE);

cal.clear(); 
cal.set(Calendar.YEAR, year); 
cal.set(Calendar.WEEK_OF_YEAR, weeki); 
cal.add(Calendar.WEEK_OF_YEAR, 1); 
edate=cal.get(Calendar.YEAR)+"-"+(cal.get(Calendar.MONTH)+1)+"-"+cal.get(Calendar.DATE);

return sdate+","+edate; 
}

import java.util.*;

public class ShowDate {

public static void main(String[] args) {

Calendar calendar = new GregorianCalendar(); 
Date trialTime = new Date(); 
calendar.setTime(trialTime);

// print out a bunch of interesting things

System.out.println("ERA: " + calendar.get(Calendar.ERA)); 
System.out.println("YEAR: " + calendar.get(Calendar.YEAR)); 
System.out.println("MONTH: " + calendar.get(Calendar.MONTH)); 
System.out.println("WEEK_OF_YEAR: " 
+ calendar.get(Calendar.WEEK_OF_YEAR)); 
System.out.println("WEEK_OF_MONTH: " 
+ calendar.get(Calendar.WEEK_OF_MONTH)); 
System.out.println("DATE: " + calendar.get(Calendar.DATE)); 
System.out.println("DAY_OF_MONTH: " 
+ calendar.get(Calendar.DAY_OF_MONTH)); 
System.out 
.println("DAY_OF_YEAR: " + calendar.get(Calendar.DAY_OF_YEAR)); 
System.out 
.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK)); 
System.out.println("DAY_OF_WEEK_IN_MONTH: " 
+ calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH)); 
System.out.println("AM_PM: " + calendar.get(Calendar.AM_PM)); 
System.out.println("HOUR: " + calendar.get(Calendar.HOUR)); 
System.out 
.println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY)); 
System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE)); 
System.out.println("SECOND: " + calendar.get(Calendar.SECOND)); 
System.out 
.println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND)); 
System.out.println("ZONE_OFFSET: " 
+ (calendar.get(Calendar.ZONE_OFFSET) / (60 * 60 * 1000))); 
System.out.println("DST_OFFSET: " 
+ (calendar.get(Calendar.DST_OFFSET) / (60 * 60 * 1000))); 
System.out.println("Current Time, with hour reset to 3"); 
calendar.clear(Calendar.HOUR_OF_DAY); // so doesn't override 
calendar.set(Calendar.HOUR, 3); 
System.out.println("ERA: " + calendar.get(Calendar.ERA)); 
System.out.println("YEAR: " + calendar.get(Calendar.YEAR)); 
System.out.println("MONTH: " + calendar.get(Calendar.MONTH)); 
System.out.println("WEEK_OF_YEAR: " 
+ calendar.get(Calendar.WEEK_OF_YEAR)); 
System.out.println("WEEK_OF_MONTH: " 
+ calendar.get(Calendar.WEEK_OF_MONTH)); 
System.out.println("DATE: " + calendar.get(Calendar.DATE)); 
System.out.println("DAY_OF_MONTH: " 
+ calendar.get(Calendar.DAY_OF_MONTH)); 
System.out 
.println("DAY_OF_YEAR: " + calendar.get(Calendar.DAY_OF_YEAR)); 
System.out 
.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK)); 
System.out.println("DAY_OF_WEEK_IN_MONTH: " 
+ calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH)); 
System.out.println("AM_PM: " + calendar.get(Calendar.AM_PM)); 
System.out.println("HOUR: " + calendar.get(Calendar.HOUR)); 
System.out 
.println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY)); 
System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE)); 
System.out.println("SECOND: " + calendar.get(Calendar.SECOND)); 
System.out 
.println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND)); 
System.out.println("ZONE_OFFSET: " 
+ (calendar.get(Calendar.ZONE_OFFSET) / (60 * 60 * 1000))); // in 
System.out.println("DST_OFFSET: " 
+ (calendar.get(Calendar.DST_OFFSET) / (60 * 60 * 1000))); // in 
}

}


原文地址http://hi.baidu.com/niuyuanli/item/726c521a27dc0615e3f98687

發佈了14 篇原創文章 · 獲贊 12 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章