程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JAVA中日期的處理 知識及教程大全

JAVA中日期的處理 知識及教程大全

編輯:關於JAVA
 

Java 語言的Calendar,GregorianCalendar (日歷),Date(日期), 和DateFormat(日期格式)組成了Java標准的一個基本但是非常重要的部分. 日期是商業邏輯計算一個關鍵的部分. 所有的開發者都應該能夠計算未來的日期, 定制日期的顯示格式, 並將文本數據解析成日期對象。學習日期, 日期格式, 日期的解析和日期的計算。

我們將討論下面的類:

1、 具體類(和抽象類相對)java.util.Date

2、 抽象類java.text.DateFormat 和它的一個具體子類,java.text.SimpleDateFormat

3、 抽象類java.util.Calendar 和它的一個具體子類,java.util.GregorianCalendar

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

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

1.1. 創建java.util.Date
Java統計從1970年1月1日起的毫秒的數量表示日期。也就是說,例如,1970年1月2日,是在1月1日後的86,400,000毫秒。同樣的,1969年12月31日是在1970年1月1日前86,400,000毫秒。Java的Date類使用long類型紀錄這些毫秒值.因為long是有符號整數,所以日期可以在1970年1月1日之前,也可以在這之後。Long類型表示的最大正值和最大負值可以輕松的表示290,000,000年的時間,這適合大多數人的時間要求。

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


01.import java.util.Date;
02.import java.text.SimpleDateFormat;
03.public class DateExample1 {
04.public static void main(String[] args) {
05.// Get the system date/time
06.Date date = new Date();
07.// 打印出具體的年,月,日,小時,分鐘,秒鐘以及時區
08.System.out.println(date.getTime());
09.}
10.}

 

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

 

01.//1年前日期
02. java.util.Date myDate=new java.util.Date();
03. long myTime=(myDate.getTime()/1000)-60*60*24*365;
04. myDate.setTime(myTime*1000);
05. String mDate=formatter.format(myDate);
06.//明天日期
07. myDate=new java.util.Date();
08. myTime=(myDate.getTime()/1000)+60*60*24;
09. myDate.setTime(myTime*1000);
10. mDate=formatter.format(myDate);
11.//兩個時間之間的天數
12. SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd");
13. java.util.Date date= myFormatter.parse("2003-05-1");
14. java.util.Date mydate= myFormatter.parse("1899-12-30");
15. long day=(date.getTime()-mydate.getTime())/(24*60*60*1000);
16.//加半小時
17.SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
18.java.util.Date date1 = format.parse("2002-02-28 23:16:00");
19.long Time=(date1.getTime()/1000)+60*30;
20.date1.setTime(Time*1000);
21.String mydate1=formatter.format(date1);
22.//年月周求日期
23.SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM F E");
24.java.util.Date date2= formatter2.parse("2003-05 5 星期五");
25.SimpleDateFormat formatter3 = new SimpleDateFormat("yyyy-MM-dd");
26.String mydate2=formatter3.format(date2);
27.//求是星期幾
28.mydate= myFormatter.parse("2001-1-1");
29.SimpleDateFormat formatter4 = new SimpleDateFormat("E");
30.String mydate3=formatter4.format(mydate);

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

// 我們能不能用下面的代碼構件出 2001/8/8 8:8


01.import java.io.*;
02. import java.util.*;
03. public class WhatIsDate
04. {
05. public static void main(String[] args) {
06. Date date = new Date(2001, 8, 8, 8, 8, 8);
07. System.out.println(date);
08. }
09. }

Java 的編譯器竟然報如下信息 (Sun JDK1.3, Windows 2000 中文下)

注意:
WhatIsDate.java 使用或覆蓋一個不鼓勵使用的API。
注意:
使用-deprecation重新編譯,以得到詳細信息。!


那麼 Date 對象究竟是為了滿足哪個需求呢?看來它不是用來實現基於年/月/日小時:分鐘 的時間表述。我們查看 Java 的文檔,我們看到有 getTime() 方法,它返回的竟然是一個 long 值。

文檔進一步又告訴我們這個值代表了當前系統的時間離1970/1/1 0:0 的毫秒差,而且是在 GMT 時區下(也被稱為 EPOC)。如果我們指定的時間是在此之前的,那它將返回一個負數值。

這個發現讓我們對 Date 對象有了一個全新的認識-Date 存放的是與 EPOC 的偏差值。換而言之我們也可通過 long 類型來表示時間?對了,這個猜想是得到了 Java 的支持:

01. // 第二種獲得當前時間的方法
02. long dateInMilliSeconds = System.currentTimeMillis();
03. // 這時候打印出的只是一串數字而已
04. System.out.println(dateInMilliSeconds);

對程序執行效率敏感的程序員可以發現這個方法只是生成一個 Java 的原始類型 (primitive type) long, 不需要實例化一個對象。因此如果我們對時間的處理只是在內部進行時,可以用 long 來代替 Date 對象。

最典型的應用就是在一段代碼開始和結束時,分別獲得系統當前的時間,然後計算出代碼執行所需的時間(微秒級)。
long start = System.currentTimeMillis();
// 代碼段
System.out.println("需要 "+(System.currentTimeMillis()-start)+" 微秒");

 

那麼當我們要把這個 long 值已更為友好的表現形式顯示處理的時候,我們可以用它來構造 Date 對象:

Date date = new Date(dateInMilliSeconds);

System.out.println(date);


我們看到了在 Java 中對時間最為基本的表示,有通過對EPOC 的偏差值進行處理。Date 對象是對它的一個對象的封裝。我們同時也看到了,在現時世界中我們對時間的描述通常是通過"某年某月某日某時某分"來定義的。Date 的顯示(實際上是 toString() 方法)描述了這些信息,但 Java 並不建議我們用這種方式直接來構件 Date 對象。因此我們需要找出哪個對象可以實現這個需求。這就是我們下面就要講述的 Calendar 對象的功能。

在我們進一步研究 Calendar 之前,請記住 Date 只是一個對 long 值(基於 GMT 時區)的對象封裝。它所表現出來的年/月/日小時:分鐘時區的時間表述,只是它的 toString() 方法所提供的。千萬不要為這個假象所迷惑。

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


01.import java.text.SimpleDateFormat;
02.import java.util.Date;
03.public class DateExample2 {  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved