一些常用的格式,比如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
public static final DateFormat

getDateInstance(int style, Locale aLocale)
普通
根据 Locale 得到对象

3
public static final DateFormat

getDateTimeInstance()
普通
得到日期时间对象

4
public static final DateFormat

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;              
      // 声明DateFormat类对象
   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对象时传递若干个参数。

范例:指定显示的风格

   1. package org.lxh.demo11.datedemo;
   2. import java.text.DateFormat;
   3. import java.util.Date;
   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;           
      // 声明DateFormat对象
   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:" +
      df2.format(new Date()));
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 日期格式化模板标记

序     号
标     记
描     述

1
y
年,年份是 4 位数字,

所以需要使用 yyyy 表示

2
M
年中的月份,月份是两位数字,

所以需要使用 MM 表示

3
d
月中的天数,天数是两位数字,

所以需要使用 dd 表示

4
H
一天中的小时数( 24 小时),

小时是两位数字,使用 HH 表示


续表

序     号
标     记
描     述

5
m
小时中的分钟数,

分钟是两位数字,使用 mm 表示

6
s
分钟中的秒数,

秒是两位数字,使用 ss 表示

7
S
毫秒数,毫秒数是 3

位数字,使用 SSS 表示

 

此外,还需要SimpleDateFormat类中的方法才可以完成,SimpleDateFormat类的常用方法如表11-10所示。

表11-10 SimpleDateFormat类中的常用方法

序     号
方     法
类     型
描     述

1
public SimpleDateFormat(String pattern)
构造
通过一个指定的模板构造对象

2
public Date parse(String source)

throws ParseException
普通
将一个包含日期的

字符串变为 Date 类型

3
public final String format(Date date)
普通
将一个 Date 类型按照指定

格式变为 String 类型

 

范例:格式化日期操作

   1. package org.lxh.demo11.datedemo;
   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型数据

   1. package org.lxh.demo11.datedemo;
   2. import java.text.SimpleDateFormat;
   3. import java.util.Date;
   4. public class StringDateDemo {
   5.     public static void main(String[] args)
      throws Exception {   // 所有异常
   6. 抛出
   7.         String strDate = "2008-10-19 10:11:30.345";
      // 定义日期时间的字符串
   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。

范例:设计一个取得日期的类,此类可以取得系统的当前时间和时间戳

   1. package org.lxh.demo11.datedemo;
   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
      (Calendar.MONTH) + 1, 2));
34.         buf.append("月");
35.         buf.append(this.addZero(calendar.get
      (Calendar.DAY_OF_MONTH), 2));
36.         buf.append("日 ");
37.         buf.append(this.addZero(calendar.get
      (Calendar.HOUR_OF_DAY), 2));
38.         buf.append("时");
39.         buf.append(this.addZero(calendar.get
      (Calendar.MINUTE), 2));
40.         buf.append("分");
41.         buf.append(this.addZero(calendar.get
42. (Calendar.SECOND), 2));
43.         buf.append("秒");
44.         buf.append(this.addZero(calendar.get
      (Calendar.MILLISECOND), 3));
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类可以方便地把一个日期变为指定格式,所以直接使用此类操作是最简单、最合适的。

范例:修改之前的程序

   1. package org.lxh.demo11.datedemo;
   2. import java.text.SimpleDateFormat;
   3. import java.util.Date;
   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()) ;
16.     }
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());
28.     }
29. }

程序运行结果:

系统日期:2008-10-19 10:47:48.610

中文日期::2008年10月19日 10时47分48秒610毫秒

时间戳:20081019104748610

以上程序完成了与11.5.1节程序相同的功能,而且代码更为简单,所以读者日后在开发代码时一定要多多设计,灵活地运用各种方法,使程序的开发更 为便捷。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hahapigzhu/archive/2009/09/05/4522573.aspx