一些常用的格式,比如yyyy-MM-dd HH:mm:ss這種,可以很輕松的格式化。我居然費大半天的時間去挨個讀取、拼接……
from:http://blog.csdn.net/hahapigzhu/archive/2009/09/05/4522573.aspx
DateFormat:
11.5.3 DateFormat類
在java.util.Date類中實際上取得的時間是一個非常正确的時間。但是因為其顯示的格式不理想,是以無法符合中國人的習慣要求,那麼實際 上此時就可以為此類進行格式化操作,變為符合于中國人習慣的日期格式。
另外,要提醒讀者的是DateFormat類與MessageFormat類都屬于Format類的子類,專門用于格式化資料使用。 DateFormat類的定義如下:
1. public abstract class DateFormat
2. extends Format
從定義上看DateFormat類是一個抽象類,是以肯定無法直接執行個體化,但是在此抽象類中提供了一個靜态方法,可以直接取得本類的執行個體,此類的常 用方法如表11-8所示。
表11-8 DateFormat類的常用方法
序 号
方 法
類 型
描 述
1
public static final DateFormat
getDateInstance()
普通
得到預設的對象
2
getDateInstance(int style, Locale aLocale)
根據 Locale 得到對象
3
getDateTimeInstance()
得到日期時間對象
4
getDateTimeInstance(int dateStyle,int
timeStyle,Locale aLocale)
根據 Locale
得到日期時間對象
以上4個方法可以構造DateFormat類的對象,但是發現以上方法中需要傳遞若幹個參數,這些參數表示日期地域或日期的顯示形式。下面通過幾段 代碼來了解DateFormat類的操作。
範例:觀察DateFormat中的預設操作
1. package org.lxh.demo11.datedemo;
2. import java.text.DateFormat;
3. import java.util.Date;
4. public class DateDemo03 {
5. public static void main(String[] args) {
6. DateFormat df1 = null;
// 聲明DateFormat類對象
7. DateFormat df2 = null;
8. df1 = DateFormat.getDateInstance();
// 取得日期
9. df2 = DateFormat.getDateTimeInstance(); // 取得日期時間
10. System.out.println("DATE:" +
df1.format(new Date()));// 格式化日期
11. System.out.println("DATETIME:" +
df2.format(new Date()));
12. }
13. }
程式運作結果:
DATE:2008-12-2
DATETIME:2008-12-2 16:25:11
從程式的運作結果中發現,第2個DATETIME顯示了時間,但還不是比較合理的中文顯示格式。如果想取得更加合理的時間,則必須在構造 DateFormat對象時傳遞若幹個參數。
範例:指定顯示的風格
4. import java.util.Locale;
5. public class DateDemo04 {
6. public static void main(String[] args) {
7. DateFormat df1 = null;
// 聲明DateFormat對象
8. DateFormat df2 = null;
9. df1 = DateFormat.getDateInstance
(DateFormat.YEAR_FIELD, new Locale(
10. "zh", "CN"));
// 取得日期,并設定日期顯示風格
11. // 取得日期時間,設定日期的顯示格式、
時間的顯示格式
12. df2 = DateFormat.getDateTimeInstance
(DateFormat.YEAR_FIELD,
13. DateFormat.ERA_FIELD, new
Locale("zh", "CN"));
14. System.out.println("DATE:" + df1.format(new Date()));
15. System.out.println("DATETIME:" +
16. }
17. }
DATE:2008年12月2日
DATETIME:2008年12月2日 下午04時30分29秒 CST
可以發現,以上的日期時間已經被格式化,格式是其預設的時間顯示格式,但是如果現在要想得到使用者自己需要的日期顯示格式,則必須通過 DateFormat的子類SimpleDateFormat類完成。
11.5.4 SimpleDateFormat類(1)
在項目開發中,會經常将一個日期格式轉換為另外一種日期格式,例如,原日期為2008-10-19 10:11:30.345,轉換後日期為2008年10月19日10時11分30秒345毫秒。從這兩個日期可以發現,日期的數字完全一樣,隻是日期格式 有所不同,要想實作轉換就必須使用java.text包中的SimpleDateFormat類完成。
首先必須先定義出一個完整的日期轉化模闆,在模闆中通過特定的日期标記可以将一個日期格式中的日期數字提取出來,日期格式化模闆标記如表11-9所 示。
表11-9 日期格式化模闆标記
标 記
y
年,年份是 4 位數字,
是以需要使用 yyyy 表示
M
年中的月份,月份是兩位數字,
是以需要使用 MM 表示
d
月中的天數,天數是兩位數字,
是以需要使用 dd 表示
H
一天中的小時數( 24 小時),
小時是兩位數字,使用 HH 表示
續表
5
m
小時中的分鐘數,
分鐘是兩位數字,使用 mm 表示
6
s
分鐘中的秒數,
秒是兩位數字,使用 ss 表示
7
S
毫秒數,毫秒數是 3
位數字,使用 SSS 表示
此外,還需要SimpleDateFormat類中的方法才可以完成,SimpleDateFormat類的常用方法如表11-10所示。
表11-10 SimpleDateFormat類中的常用方法
public SimpleDateFormat(String pattern)
構造
通過一個指定的模闆構造對象
public Date parse(String source)
throws ParseException
将一個包含日期的
字元串變為 Date 類型
public final String format(Date date)
将一個 Date 類型按照指定
格式變為 String 類型
範例:格式化日期操作
2. import java.text.ParseException;
3. import java.text.SimpleDateFormat;
4. import java.util.Date;
5. public class DateDemo05 {
6. public static void main(String[] args){
7. String strDate = "2008-10-19 10:11:30.345";
// 定義日期時間的字元串
8. // 準備第1個模闆,從字元串中提取日期數字
9. String pat1 = "yyyy-MM-dd HH:mm:ss.SSS";
10. // 準備第2個模闆,将提取後的日期數字變為指定的格式
11. String pat2 = "yyyy年MM月dd日HH時mm分ss秒SSS毫秒";
12. SimpleDateFormat sdf1 = new
SimpleDateFormat(pat1);// 執行個體化模闆對象
13. SimpleDateFormat sdf2 = new
SimpleDateFormat(pat2);// 執行個體化模闆對象
14. Date d = null;
15. try {
16. d = sdf1.parse(strDate);
// 将給定字元串中的日期提取出來
17. } catch (ParseException e) {
// 如果提供的字元串格式有錯誤,則進
18. 行異常處理
19. e.printStackTrace();
20. }
21. System.out.println(sdf2.format(d));// 将日期變為新的格式
22. }
23. }
2008年10月19日10時11分30秒345毫秒
以上程式中,首先使用第1個模闆将字元串中表示的日期數字取出,然後再使用第2個模闆将這些日期數字重新轉化為新的格式表示。
11.5.4 SimpleDateFormat類(2)
U提示:SimpleDateFormat類經常用于将String變為Date型資料。
在實際的開發中,使用者所輸入的各個資料都是以String的方式進行接收的,是以此時為了可以正确地将String變為Date型資料,可以依靠 SimpleDateFormat類完成。
範例:将String型資料變為Date型資料
2. import java.text.SimpleDateFormat;
4. public class StringDateDemo {
5. public static void main(String[] args)
throws Exception { // 所有異常
6. 抛出
8. String pat = "yyyy-MM-dd HH:mm:ss.SSS";
// 定義模闆
9. SimpleDateFormat sdf = new
SimpleDateFormat(pat); // 執行個體化模闆對象
10. Date d = sdf.parse(strDate);
// 将給定字元串中的日期
11. 提取出來
12. System.out.println(d) ;
// 輸出Date對象
13. }
14. }
Sun Oct 19 10:11:30 CST 2008
以上程式已經實作了String向Date的轉型操作,這樣的操作在講解Java資料庫程式設計時将會經常使用。
11.5.5 執行個體操作--取得完整日期
1.實作一:基于Calendar類
以上已經為讀者清楚地介紹了如何取得一個系統的日期以及對日期格式的轉化操作,但是如果所有的程式都按Calendar程式那樣取得日期,則代碼肯 定會重複很多次,是以可以考慮單獨去設計一個類,此類可以取得目前系統的日期時間。但是在使用Calendar類得到時間時有一個問題,例如,現在的月份 是9月,正确的日期格式應該是09,但是因為得到日期的方法傳回的是int類型,是以最終的傳回結果是9,也就是說要想達到正确的顯示效果,則必須在9前 補一個0。
範例:設計一個取得日期的類,此類可以取得系統的目前時間和時間戳
2. import java.util.Calendar;
3. import java.util.GregorianCalendar;
4. class DateTime {
5. private Calendar calendar = null;
// 定義一個Calendar對象,可以
6. 取得時間
7. public DateTime() {
8. this.calendar = new GregorianCalendar();//
通過Calendar類的子類執行個體化
9. }
10. public String getDate() { // 得到完整的日期,
格式為:yyyy-MM-dd HH:mm:ss.
11. SSS
12. // 考慮到程式要頻繁修改字元串,是以使用StringBuffer提升性能
13. StringBuffer buf = new StringBuffer();
14. // 依次取得時間
15. buf.append(calendar.get(Calendar.YEAR)).append("-");
16. buf.append(this.addZero(calendar.get
(Calendar.MONTH) + 1, 2));
17. buf.append("-");
18. buf.append(this.addZero(calendar.get
(Calendar.DAY_OF_MONTH), 2));
19. buf.append(" ");
20. buf.append(this.addZero(calendar.get
(Calendar.HOUR_OF_DAY), 2));
21. buf.append(":");
22. buf.append(this.addZero(calendar.get
(Calendar.MINUTE), 2));
23. buf.append(":");
24. buf.append(this.addZero(calendar.get
(Calendar.SECOND), 2));
25. buf.append(".");
26. buf.append(this.addZero(calendar.get
(Calendar.MILLISECOND), 3));
27. return buf.toString();
28. }
29. // 得到完整的日期,格式為:yyyy年MM月dd日HH時mm分ss秒SSS毫秒
30. public String getDateComplete() {
31. StringBuffer buf = new StringBuffer();
32. buf.append(calendar.get(Calendar.YEAR)).append("年");
33. buf.append(this.addZero(calendar.get
34. buf.append("月");
35. buf.append(this.addZero(calendar.get
36. buf.append("日 ");
37. buf.append(this.addZero(calendar.get
38. buf.append("時");
39. buf.append(this.addZero(calendar.get
40. buf.append("分");
41. buf.append(this.addZero(calendar.get
42. (Calendar.SECOND), 2));
43. buf.append("秒");
44. buf.append(this.addZero(calendar.get
45. buf.append("毫秒");
46. return buf.toString();
47. }
48. // 考慮到日期中有前導0,是以在此處加上了補零的方法
49. private String addZero(int num, int len) {
50. StringBuffer s = new StringBuffer();
51. s.append(num);
52. while (s.length() < len) { // 如果長度不足,則繼續補0
53. s.insert(0, "0"); // 在第1個位置處補0
54. }
55. return s.toString();
56. }
57. public String getTimeStamp() { //
得到時間戳:yyyyMMddHHmmssSSS
58. StringBuffer buf = new StringBuffer();
59. buf.append(calendar.get(Calendar.YEAR));
60. buf.append(this.addZero(calendar.
get(Calendar.MONTH) + 1, 2));
61. buf.append(this.addZero(calendar.
get(Calendar.DAY_OF_MONTH), 2));
62. buf.append(this.addZero(calendar.
get(Calendar.HOUR_OF_DAY), 2));
63. buf.append(this.addZero(calendar.
get(Calendar.MINUTE), 2));
64. buf.append(this.addZero(calendar.
get(Calendar.SECOND), 2));
65. buf.append(this.addZero(calendar.
get(Calendar.MILLISECOND), 3));
66. return buf.toString();
67. }
68. };
69. public class DateDemo06 {
70. public static void main(String[] args) {
71. DateTime dt = new DateTime();
// 執行個體化DateTime對象
72. System.out.println("系統日期:" + dt.getDate());
73. System.out.println("中文日期::" + dt.getDateComplete());
74. System.out.println("時間戳:" + dt.getTimeStamp());
75. }
76. }
系統日期:2008-10-19 10:42:50.562
中文日期::2008年10月19日 10時42分50秒562毫秒
時間戳:20081019104250562
以上程式已經完成了設計的要求,但程式代碼太長、太複雜,那麼有沒有更好的方式呢?實際上是有的,SimpleDateFormat類中可以對一個 Date類型進行格式修改的方法,直接使用此方法就可以将一個目前日期的Date類型變為指定的日期格式。
2.實作二:基于SimpleDateFormat類
使用SimpleDateFormat類可以友善地把一個日期變為指定格式,是以直接使用此類操作是最簡單、最合适的。
範例:修改之前的程式
4. class DateTime{
5. // 聲明日期格式化操作對象,直接對new Date()進行執行個體化
6. private SimpleDateFormat sdf = null ;
7. // 得到完整的日期,格式為:yyyy-MM-dd HH:mm:ss.SSS
8. public String getDate(){
9. this.sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
10. return this.sdf.format(new Date()) ;
11. }
12. // 得到完整的日期,格式為:yyyy年MM月dd日HH時mm分ss秒SSS毫秒
13. public String getDateComplete(){
14. this.sdf = new SimpleDateFormat("yyyy年
MM月dd日 HH時mm分ss秒SSS毫秒");
15. return this.sdf.format(new Date()) ;
17. public String getTimeStamp(){ // 得到時間戳:yyyyMMddHHmmssSSS
18. this.sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
19. return this.sdf.format(new Date()) ;
20. }
21. };
22. public class DateDemo07 {
23. public static void main(String[] args) {
24. DateTime dt = new DateTime(); // 執行個體化DateTime對象
25. System.out.println("系統日期:" + dt.getDate());
26. System.out.println("中文日期::" + dt.getDateComplete());
27. System.out.println("時間戳:" + dt.getTimeStamp());
29. }
系統日期:2008-10-19 10:47:48.610
中文日期::2008年10月19日 10時47分48秒610毫秒
時間戳:20081019104748610
以上程式完成了與11.5.1節程式相同的功能,而且代碼更為簡單,是以讀者日後在開發代碼時一定要多多設計,靈活地運用各種方法,使程式的開發更 為便捷。