Java常用类库之时间操作类——Date、Calendar、DateFormat、SimpleDateFormat及实例操作

来源:互联网 发布:重庆大学网络教育 编辑:程序博客网 时间:2024/05/17 04:53

 学习目标

 掌握Date类的使用
可以使用Calendar类取得一个完整的日期
掌握日期格式化的操作
可以使用SimpleDateFormat进行日期的格式化转换操作
编写取得日期的操作类
进一步掌握Calendar类的使用
进一步掌握SimpleDateFormat类的使用

Date类是一个较为常用的类,但是其操作的日期格式会有一些不符合个人要求,而如果想要进一步取得一些自己需要的时间,则可以使用Calendar类。

Date类

在java.util包中定义了Date类,Date类本身使用非常简单,直接输出其实例化对象即可。
import java.util.Date ;public class DateDemo01{public static void main(String args[]){Date date = new Date() ;// 直接实例化Date对象System.out.println("当前日期为:" + date) ;}};

如果现在希望可以按照自己需要的格式显示时间,则就可以使用Calendar类。

Calendar类

使用此类可以直接将日期精确到毫秒
public abstract class Calendar
extends Object
implements Serializable, Cloneable, Comparable<Calendar>
Calendar类是一个抽象类,既然是一个抽象类则肯定无法直接使用,此时就要利用对象多态性的概念,通过向上的转型关系实例化本类对象。
通过Calendar类取得一个完整的日期。使用子类。
import java.util.* ;public class DateDemo02{public static void main(String args[]){Calendar calendar = new GregorianCalendar();// 实例化Calendar类对象System.out.println("YEAR: " + calendar.get(Calendar.YEAR));System.out.println("MONTH: " + (calendar.get(Calendar.MONTH) + 1));System.out.println("DAY_OF_MONTH: " + calendar.get(Calendar.DAY_OF_MONTH));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));}};

通过此类就可以非常轻松取得一个完整的日期,但是在取得月份的时候要特别注意需要加一。
如果按照此种方式取得,则也会很麻烦,最好的方法是将Date进行一些相关格式化的操作。

DateFormat类

此类是一个日期格式化类,专门格式化日期的操作,因为java.util.Date 类本身已经包含了完整的日期,所以只需要将日期按照一些指定的格式格式化一下显示就好了。
观察DateFormat类的定义:此类是定义在java.text包中的。

 但是从定义上可以发现,此类是一个抽象类,按照以往的思路,直接使用其子类实例化即可。但是DateFormat类的内部提供了可以直接为其实例化的操作。
得到日期的DateFormat对象:public static final DateFormat getDateInstance()
得到日期时间的DateFormat对象:public static final DateFormat getDateTimeInstance()。
直接使用DateFormat类完成Date类的转换功能:
public final String format(Date date)
代码如下:
import java.text.DateFormat ;import java.util.Date ;public class DateDemo03{public static void main(String args[]){DateFormat df1 = null ;// 声明一个DateFormatDateFormat df2 = null ;// 声明一个DateFormatdf1 = DateFormat.getDateInstance() ;// 得到日期的DateFormat对象df2 = DateFormat.getDateTimeInstance() ;// 得到日期时间的DateFormat对象System.out.println("DATE:" + df1.format(new Date())) ; // 按照日期格式化System.out.println("DATETIME:" + df2.format(new Date())) ; // 按照日期时间格式化}};


通过此类可以直接将Date类的显示进行合理的格式化操作。此时采用的是默认的格式化操作,也可以通过Locale对象指定要显示的区域。指定的区域是中国。
 具体的可以查找文档API
Objectclone()           重写 Cloneable booleanequals(Object obj)           重写 equals Stringformat(Date date)           将一个 Date 格式化为日期/时间字符串。abstract  StringBufferformat(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition)           将一个 Date 格式化为日期/时间字符串。 StringBufferformat(Object obj, StringBuffer toAppendTo, FieldPosition fieldPosition)           重写 Format。static Locale[]getAvailableLocales()           返回所有语言环境的数组,此类的 get*Instance 方法可以为其返回已本地化的实例。 CalendargetCalendar()           获取与此日期/时间格式器关联的日历。static DateFormatgetDateInstance()           获取日期格式器,该格式器具有默认语言环境的默认格式化风格。static DateFormatgetDateInstance(int style)           获取日期格式器,该格式器具有默认语言环境的给定格式化风格。static DateFormatgetDateInstance(int style, Locale aLocale)           获取日期格式器,该格式器具有给定语言环境的给定格式化风格。static DateFormatgetDateTimeInstance()           获取日期/时间格式器,该格式器具有默认语言环境的默认格式化风格。static DateFormatgetDateTimeInstance(int dateStyle, int timeStyle)           获取日期/时间格式器,该格式器具有默认语言环境的给定日期和时间格式化风格。static DateFormatgetDateTimeInstance(int dateStyle, int timeStyle, Locale aLocale)           获取日期/时间格式器,该格式器具有给定语言环境的给定格式化风格。
等等。
程序代码示例如下:
import java.text.DateFormat ;import java.util.Date ;import java.util.Locale ;public class DateDemo04{public static void main(String args[]){DateFormat df1 = null ;// 声明一个DateFormatDateFormat df2 = null ;// 声明一个DateFormatdf1 = DateFormat.getDateInstance(DateFormat.YEAR_FIELD,new Locale("zh","CN")) ;// 得到日期的DateFormat对象df2 = DateFormat.getDateTimeInstance(DateFormat.YEAR_FIELD,DateFormat.ERA_FIELD,new Locale("zh","CN")) ;// 得到日期时间的DateFormat对象System.out.println("DATE:" + df1.format(new Date())) ; // 按照日期格式化System.out.println("DATETIME:" + df2.format(new Date())) ; // 按照日期时间格式化}};

SimpleDateFormat类

查找官方API如下:

java.lang.Object

  java.text.Format

      java.text.DateFormat

          java.text.SimpleDateFormat

所有已实现的接口:

Serializable,Cloneable

public class SimpleDateFormat

extends DateFormat

SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。

SimpleDateFormat 使得可以选择任何用户定义的日期-时间格式的模式。但是,仍然建议通过DateFormat 中的getTimeInstancegetDateInstancegetDateTimeInstance 来创建日期-时间格式器。每一个这样的类方法都能够返回一个以默认格式模式初始化的日期/时间格式器。可以根据需要使用applyPattern 方法来修改格式模式。有关使用这些方法的更多信息,请参阅DateFormat

......

此类的功能是完成日期的格式化显示的,例如,在开发中,可能会将一种日期格式变为另外一种日期格式,如下所示:

  原始日期:2008-10-19 10:11:30.345

  转换后的日期:2208年 10月 19日 10时 11分 30秒 345毫秒

但是以上的两个日期中日期的数字是完全一样的,唯一不同的是日期的显示格式不同,所以要想实现这样的转换功能就必须依靠SimpleDateFormat类。

 如果想实现转换,则必须首先准备好一个模板,通过此模板进行日期数字的提取工作。

NO    标记               描述

1        y                  表示年,年份是四位数字,所以需要使用“yyyy”表示年。

2        M                 表示月,月份是两位数字,所以需要使用“MM”表示月。

3        d                  表示日,日是两位数字,所以需要使用“dd”表示日。

4        H或h            表示时,两位数字,如果用“HH”表示24小时制,如果“hh”表示12小时制。

5        m                 表示分,两位数字 “mm”。

6        s                  表示秒,两位数字“ss”。

7        S                 表示毫秒,三位数字“SSS”。

在SimpleDateFormat类使用的时候,必须注意的是在构造对象时传入匹配的模板。

构造方法:public  SimpleDateFormat(String pattern)

转换:public Date parse(String source) throws ParseException  此时取得是全部的时间数。

格式化:public final String format(Date date)  将时间重新格式化成字符串显示。

代码示例如下:

import java.text.* ;import java.util.* ;public class DateDemo05{public static void main(String args[]){String strDate = "2008-10-19 10:11:30.345" ;// 准备第一个模板,从字符串中提取出日期数字String pat1 = "yyyy-MM-dd HH:mm:ss.SSS" ;// 准备第二个模板,将提取后的日期数字变为指定的格式String pat2 = "yyyy年MM月dd日 HH时mm分ss秒SSS毫秒" ;SimpleDateFormat sdf1 = new SimpleDateFormat(pat1) ;// 实例化模板对象SimpleDateFormat sdf2 = new SimpleDateFormat(pat2) ;// 实例化模板对象Date d = null ;try{d = sdf1.parse(strDate) ;// 将给定的字符串中的日期提取出来}catch(Exception e){// 如果提供的字符串格式有错误,则进行异常处理e.printStackTrace() ;// 打印异常信息}System.out.println(sdf2.format(d)) ;// 将日期变为新的格式}};

取得系统时间——基于Calendar类操作

除了取出日期之外,取得时间戳也是一种比较常见的操作,例如:以下的日期:
2009-010-16 11:25:34.953
时间戳:20090116112534953
代码示例如下:
import java.util.* ;// 导入需要的工具包class DateTime{// 以后直接通过此类就可以取得日期时间private Calendar calendar = null ;// 声明一个Calendar对象,取得时间public DateTime(){// 构造方法中直接实例化对象this.calendar = new GregorianCalendar() ;}public String getDate(){// 得到的是一个日期:格式为:yyyy-MM-dd HH:mm:ss.SSS// 考虑到程序要频繁修改字符串,所以使用StringBuffer提升性能StringBuffer buf = new StringBuffer() ;buf.append(calendar.get(Calendar.YEAR)).append("-") ;// 增加年buf.append(this.addZero(calendar.get(Calendar.MONTH)+1,2)).append("-") ;// 增加月buf.append(this.addZero(calendar.get(Calendar.DAY_OF_MONTH),2)).append(" ") ;// 取得日buf.append(this.addZero(calendar.get(Calendar.HOUR_OF_DAY),2)).append(":") ;// 取得时buf.append(this.addZero(calendar.get(Calendar.MINUTE),2)).append(":") ;buf.append(this.addZero(calendar.get(Calendar.SECOND),2)).append(".") ;buf.append(this.addZero(calendar.get(Calendar.MILLISECOND),3)) ;return buf.toString() ;}public String getDateComplete(){// 得到的是一个日期:格式为:yyyy年MM月dd日 HH时mm分ss秒SSS毫秒// 考虑到程序要频繁修改字符串,所以使用StringBuffer提升性能StringBuffer buf = new StringBuffer() ;buf.append(calendar.get(Calendar.YEAR)).append("年") ;// 增加年buf.append(this.addZero(calendar.get(Calendar.MONTH)+1,2)).append("月") ;// 增加月buf.append(this.addZero(calendar.get(Calendar.DAY_OF_MONTH),2)).append("日") ;// 取得日buf.append(this.addZero(calendar.get(Calendar.HOUR_OF_DAY),2)).append("时") ;// 取得时buf.append(this.addZero(calendar.get(Calendar.MINUTE),2)).append("分") ;// 取得分buf.append(this.addZero(calendar.get(Calendar.SECOND),2)).append("秒") ;// 取得秒buf.append(this.addZero(calendar.get(Calendar.MILLISECOND),3)).append("毫秒") ; // 取得毫秒return buf.toString() ;}public String getTimeStamp(){// 得到的是一个时间戳// 考虑到程序要频繁修改字符串,所以使用StringBuffer提升性能StringBuffer buf = new StringBuffer() ;buf.append(calendar.get(Calendar.YEAR)) ;// 增加年buf.append(this.addZero(calendar.get(Calendar.MONTH)+1,2)) ;// 增加月buf.append(this.addZero(calendar.get(Calendar.DAY_OF_MONTH),2)) ;// 取得日buf.append(this.addZero(calendar.get(Calendar.HOUR_OF_DAY),2)) ;// 取得时buf.append(this.addZero(calendar.get(Calendar.MINUTE),2)) ;// 取得分buf.append(this.addZero(calendar.get(Calendar.SECOND),2));// 取得秒buf.append(this.addZero(calendar.get(Calendar.MILLISECOND),3)) ; // 取得毫秒return buf.toString() ;}// 考虑到日期中存在前导0,所以在此处加上补零的方法private String addZero(int num,int len){StringBuffer s = new StringBuffer() ;s.append(num) ;while(s.length()<len){// 如果长度不足,则继续补0s.insert(0,"0") ;// 在第一个位置处补0}return s.toString() ;}};public class DateDemo06{public static void main(String args[]){DateTime dt = new DateTime() ;System.out.println("系统日期:"+dt.getDate()) ;System.out.println("中文日期:"+dt.getDateComplete()) ;System.out.println("时间戳:"+dt.getTimeStamp()) ;}};

以上的程序已经取得了日期时间、中文的日期时间、时间戳,但是所有的操作都比较麻烦,因为每一个地方还需要进行步0操作,所以,在直接使用Calendar类的时候虽然可以方便的将时间取得精确到毫秒,但是在取得完整的时间就非常的不方便了。

基于SimpleDateFormat类操作

java.util.Date 是一个完整的日期,SimpleDateFormat类中存在一个方法,可以针对于Date重新格式化。
程序代码示例如下:
import java.util.* ;// 导入需要的工具包import java.text.* ;// 导入SimpleDateFormat所在的包class DateTime{// 以后直接通过此类就可以取得日期时间private SimpleDateFormat sdf = null ;// 声明SimpleDateFormat对象public String getDate(){// 得到的是一个日期:格式为:yyyy-MM-dd HH:mm:ss.SSSthis.sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") ;return this.sdf.format(new Date()) ;// 将当前日期进行格式化操作}public String getDateComplete(){// 得到的是一个日期:格式为:yyyy年MM月dd日 HH时mm分ss秒SSS毫秒this.sdf = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒SSS毫秒") ;return this.sdf.format(new Date()) ;// 将当前日期进行格式化操作}public String getTimeStamp(){// 得到的是一个时间戳this.sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS") ;return this.sdf.format(new Date()) ;// 将当前日期进行格式化操作}};public class DateDemo07{public static void main(String args[]){DateTime dt = new DateTime() ;System.out.println("系统日期:"+dt.getDate()) ;System.out.println("中文日期:"+dt.getDateComplete()) ;System.out.println("时间戳:"+dt.getTimeStamp()) ;}};


总结:

1、DateFormat可以直接使用,但其本身是一个抽象类,可以根据Locale指定的区域得到不同的日期时间显示效果。
2、SimpleDateFormat类是DateFormat的子类,一般情况下来讲DateFormat类很少会直接使用,而都使用SimpleDateFormat类完成。


 



1 0
原创粉丝点击