Java常用工具类之Date类和Calender类

1、 Date类中常用方法

1. Date类的常用方法

Date类的常用方法

方法

含义

new Date()

实例化Date对象,常见于获得系统当前时间

new Date(long time)

实例化Date对象,并根据具体的时间偏移量time设置时间

boolean after(Date when)

测试此日期是否在指定日期之后

boolean before(Date when)

测试此日期是否在指定日期之前

int compareTo(Date anotherDate)

比较两个日期的顺序。如果参数 Date 等于此 Date,则返回值 0;如果此 Date 在 Date 参数之前,则返回小于 0 的值;如果此 Date 在 Date 参数之后,则返回大于 0 的值。

boolean equals(Object obj)

比较两个日期的相等性。

【例1-17】Date类常用方法练习


public class TestDate {
    public static void main(String[] args) {
        Date now = new Date();//获取当前系统时间
        System.out.println(now); //获取1970年1月1日1000毫秒之后的时间
        Date d1 = new Date(1000);
        System.out.println(now.after(d1));
        System.out.println(now.before(d1));
        System.out.println(now.compareTo(d1));
    }
}

程序运行结果:

true

false

1

Date类不支持国际化。现在我们更应该多使用Calendar类来实现日期和时间字段之间转换,使用DateFormat类来格式化和分析日期字符串,而Date中的相应方法已废弃。

2. Calender类

由于Date类的设计目的更多的是偏向于寻求一种简单的方式表达时间,所以从JDK1.1版本开始,在处理日期和时间时,系统推荐使用相对复杂、功能完备的Calendar类进行实现。在设计上,Calendar类的功能要比Date类强大很多,而且在实现方式上也比Date类要复杂一些,下面就介绍一下Calendar类的使用。

java.util.Calendar是一个抽象的基类,创建对象需要使用静态方法Calendar.getInstance()完成。通过Calendar对象可以获得详细的日历信息,例如年、月、日、小时、分和秒,Calendar的子类可以实现特定的日历系统。

1、使用Calendar类代表当前时间
Calendar c = Calendar.getInstance();

由于Calendar类是抽象类,且Calendar类的构造方法是protected的,所以无法使用Calendar类的构造方法来创建对象,API中提供了getInstance()方法用来创建对象。

使用该方法获得的Calendar对象就代表当前的系统时间,由于Calendar类toString实现的没有Date类那么直观,所以直接输出Calendar类的对象意义不大。

2、使用Calendar类代表指定的时间
Calendar c1 = Calendar.getInstance();
c1.set(2009, 3 - 1, 9);

使用Calendar类代表指定的时间,需要首先创建一个Calendar的对象,然后再设定该对象中的年月日参数来完成。

set()方法的声明为:

public final void set(int year, int month, int date)

以上示例代码设置的时间为2009年3月9日,其参数的结构和Date类不一样。Calendar类中年份的数值直接书写,月份的值为实际的月份值减1,日期的值就是实际的日期值。如果只设定某个字段,例如日期的值,则可以使用如下set()方法:

public void set(int field, int value)

在该方法中,参数field代表要设置的字段的类型,常见类型如下:

Calendar.YEAR——年份

Calendar.MONTH——月份

Calendar.DATE——日期

Calendar.DAY_OF_MONTH——日期,和上面的字段完全相同

Calendar.HOUR——12小时制的小时数

Calendar.HOUR_OF_DAY——24小时制的小时数

Calendar.MINUTE——分钟

Calendar.SECOND——秒

Calendar.DAY_OF_WEEK——星期几

后续的参数value代表,设置成的值。例如:

Calendar c1 = Calendar.getInstance();
c1.set(Calendar.DATE,10);

该代码的作用是将c1对象代表的时间中日期设置为10号,其它所有的数值会被重新计算,例如星期几以及对应的相对时间数值等。

3、从Calendar对象中获得信息

使用Calendar类中的get()方法可以获得Calendar对象中对应的信息,

get()方法的声明如下:

public int get(int field);

其中参数field代表需要获得的字段的值,字段说明和上面的set()方法保持一致。需要说明的是,获得的月份为实际的月份值减1,获得的星期的值和Date类不一样。在Calendar类中,周日是1,周一是2,周二是3,依次类推。

	Calendar c2 = Calendar.getInstance();
  int year = c2.get(Calendar.YEAR); //年份
	int month = c2.get(Calendar.MONTH) + 1; //月份
  int date = c2.get(Calendar.DATE); //日期
  int hour = c2.get(Calendar.HOUR_OF_DAY); //小时
  int minute = c2.get(Calendar.MINUTE); //分钟
  int second = c2.get(Calendar.SECOND); //秒
  int day = c2.get(Calendar.DAY_OF_WEEK); //星期几
  System.out.println("年份:" + year);
  System.out.println("月份:" + month);
  System.out.println("日期:" + date);
  System.out.println("小时:" + hour);
  System.out.println("分钟:" + minute);
  System.out.println("秒:" + second);
  System.out.println("星期:" + day);
4、其它方法说明

Calendar类中还提供了很多其它有用的方法,下面简单的介绍几个常见方法的使用。

(1) add()方法

public abstract void add(int field,int amount)

该方法的作用是在Calendar对象中的某个字段上增加或减少一定的数值,增加时amount的值为正,减少时amount的值为负。

例如,计算一下当前时间100天以后的日期,代码如下:

Calendar c3 = Calendar.getInstance();
c3.add(Calendar.DATE, 100);
int year1 = c3.get(Calendar.YEAR);
int month1 = c3.get(Calendar.MONTH) + 1; //月份
int date1 = c3.get(Calendar.DATE); //日期
System.out.println(year1 + "年" + month1 + "月" + date1 + "日");

这里add()方法是指在c3对象的Calendar.DATE,也就是日期字段上增加100,类内部会重新计算该日期对象中其它各字段的值,从而获得100天以后的日期,例如若当前时间为2015年8月7日,则程序的输出结果为:2015年11月15日

(2) after()方法

public boolean after(Object when)

该方法的作用是判断当前日期对象是否在when对象的后面,如果在when对象的后面则返回true,否则返回false。例如:

Calendar c4 = Calendar.getInstance();
c4.set(2009, 10 - 1, 10);
Calendar c5 = Calendar.getInstance();
c5.set(2010, 10 - 1, 10);
boolean b = c5.after(c4);
System.out.println(b);

在该示例代码中对象c4代表的时间是2009年10月10号,对象c5代表的时间是2010年10月10号,则对象c5代表的日期在c4代表的日期之后,所以after()方法的返回值是true。

另外一个类似的方法是before(),该方法是判断当前日期对象是否位于另外一个日期对象之前。

(3) getTime()方法

public final Date getTime()

该方法的作用是将Calendar类型的对象转换为对应的Date类对象,两者代表相同的时间点。

类似的方法是setTime(),该方法的作用是将Date对象转换为对应的Calendar对象,该方法的声明如下:

public final void setTime(Date date)

转换的示例代码如下:

Date d = new Date();
Calendar c6 = Calendar.getInstance();
//Calendar类型的对象转换为Date对象
Date d1 = c6.getTime();
//Date类型的对象转换为Calendar对象
Calendar c7 = Calendar.getInstance();
c7.setTime(d);
5、Calendar对象和相对时间之间的互转  
Calendar c8 = Calendar.getInstance();
  long t = 1252785271098L;
  //将Calendar对象转换为相对时间
  long t1 = c8.getTimeInMillis();
  //将相对时间转换为Calendar对象
  Calendar c9 = Calendar.getInstance();
  c9.setTimeInMillis(t1);

在转换时,使用Calendar类中的getTimeInMillis()方法可以将Calendar对象转换为相对时间。在将相对时间转换为Calendar对象时,首先创建一个Calendar对象,然后再使用Calendar类的setTimeInMillis()方法设置时间即可。

3. Calendar 类常用属性

Calendar类的常用属性

属性

含义

public final static int HOUR

小时时间

public final static int MINUTE

分时间

public final static int SECOND

秒时间

public final static int DATE

日期的Date部分

public final static int MONTH

日期的Month部分

public final static int YEAR

日期的年部分

【例】Calendar类使用练习

   public class TestCalendar {
        public static void main(String[] args) {
            //获取Calendar类的实例
            Calendar c = Calendar.getInstance();
            System.out.println(c.get(Calendar.YEAR)+"年"+
                               (c.get(Calendar.MONTH)+1)+"月"+
                               c.get(Calendar.DAY_OF_MONTH)+"日");        
            //设置指定时间
            c.set(2011,10,11);
            System.out.println(c.get(Calendar.YEAR)+"年"+ (c.get(Calendar.MONTH)+1)+"月"+      
                               c.get(Calendar.DAY_OF_MONTH)+"日");
            Calendar c1 = Calendar.getInstance();
            Calendar c3 = Calendar.getInstance();
            c3.add(Calendar.DATE, 100);
            int year1 = c3.get(Calendar.YEAR);
            int month1 = c3.get(Calendar.MONTH) + 1; //月份
            int date1 = c3.get(Calendar.DATE); //日期
            System.out.println(year1 + "年" + month1 + "月" + date1 + "日");
        }
    }

程序分析:本例使用时间和日期处理方法进行计算。该程序实现的原理为:首先代表两个特定的时间点,这里使用Calendar的对象进行代表,然后将两个时间点转换为对应的相对时间,求两个时间点相对时间的差值,然后除以1天的毫秒数(24小时X60分钟X60秒X1000毫秒)即可获得对应的天数。

【例】输出当前月的月历,该示例的功能是输出当前系统时间所在月的日历,例如当前系统时间是2009年3月10日,则输出2009年3月的日历。

import java.util.Calendar;
public class DateExample2{
    public static void main(String[] args){
        //获得当前时间
        Calendar c = Calendar.getInstance();
        //设置代表的日期为1号
        c.set(Calendar.DATE,1);
        //获得1号是星期几
        int start = c.get(Calendar.DAY_OF_WEEK);
        //获得当前月的最大日期数
        int maxDay = c.getActualMaximum(Calendar.DATE);   
        //输出标题
        System.out.println("星期日星期一星期二星期三星期四星期五星期六");
        //输出开始的空格
        for(int i = 1;i < start;i++){
            System.out.print("   "); 
        }
        //输出该月中的所有日期
        for(int i = 1; i <= maxDay; i++){
            //输出日期数字
            System.out.print(" " + i);
            //输出分隔空格
            System.out.print("    ");
            if(i < 10){
                System.out.print(' ');
            }
            //判断是否换行
            if((start + i - 1) % 7 == 0){
                System.out.println();       
            }
        }
        //换行
        System.out.println();       
    }       
}

程序运行结果:

程序分析:该程序实现的原理为:首先获得该月1号是星期几,然后获得该月的天数,最后使用流程控制实现按照日历的格式进行输出即可。即如果1号是星期一,则打印一个单位的空格,如果1号是星期二,则打印两个单位的空格,依次类推。打印完星期六的日期以后,进行换行。

4. SimpleDateFormat类的使用

java.text.SimpleDateFormat是一个以与语言环境相关的方式来格式化和分析日期的具体类,是抽象类java.text.DateFormat类的子类.

SimpleDateFormat使得可以选择任何用户定义的日期-时间格式的模式,获取SimpleDateFormat的实例如下:

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

上面代码确立了转换的格式,yyyy是完整的西元年,MM是月份,dd是日期,HH:mm:ss分别是小时、分和秒。至于为什么有的格式大写,有的格式小写,那是怕避免混淆,例如MM是月份,mm是分;HH是24小时制,而hh是12小时制,下表列出了SimpleDateFormat类中的模式字母。

SimpleDateFormat类中的模式字母

字母

日期或时间元素

y

M

年中的月份

d

月份中的天数

E

星期中的天数

a

Am/pm 标记

H

一天中的小时数(0-23)

h

am/pm 中的小时数(1-12)

m

小时中的分钟数

s

分钟中的秒数

S

毫秒数

1.字符串转日期:

字符串"2002-10-8 15:30:22",如果要把它转成日期,可以用以下代码:

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  

Date date=sdf.parse("2002-10-8 15:30:22"); 

2.日期转字符串:

假如把今天的日期转成字符串可用

String datestr=sdf.format(new Date()); 

这个字符串的内容便类似2002-10-08 14:55:38

透过这个API我们便可以随心所欲的将日期转成我们想要的字符串格式,例如希望将日期输出成2002年10月08日,可以这么写:

SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日"); 

String dateStr=sdf.format(new Date()); 

dateStr便会依照我们设定的格式输出。

【例】SimpleDateFormat的使用。

public class TestDateFormat {
   public static void main(String[] args) {
       //获取指定日期格式的SimpleFormat实例 1999年09月09日 12:12:12
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");           //获取指定日期的格式化字符串
		  String nowStr = sdf.format(new Date());
       System.out.println(nowStr);    
       //将格式化的字符串转换成日期
       try {
             Date d = sdf.parse("2011-11-11 11:11:11");
             System.out.println(d);
         } catch (ParseException e) {
            System.out.println("输入的字符串不符合日期的格式");
            e.printStackTrace();
}    
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值