Thinking in Java---使用Java处理日期和时间

日期的处理是一个很常见的问题,Java中用来处理时间的有Date,DateFormat,Calendar这几个类。使用这几个类可以方便的获得一个时间对象、将时间对象以指定格式显示、将格式化的字符串解析为时间对象和对时间进行加减操作。

1.Date类
Date类对象代表的就是时间对象,准确的来说是从1970-01-01 0:0:0以来的毫秒数 ,这个时间通常被称为Java 虚拟机(JVM)主机环境的系统时间。详见下面的代码:

package com.lkl.Study;

import java.util.Date;

public class DateTest {
    public static void main(String[] args){
        Date date = new Date();
        System.out.println(date);//Thu Jul 28 20:55:05 CST 2016

        //使用getTime方法取出的就是从1970-01-01 0:0:0以来的毫秒数,是一个长整型数
        System.out.println(date.getTime());//1469710505555

        //也可以long类型的数,构造一个时间对象
        Date date1 = new Date(date.getTime()+10000000000L);
        System.out.println(date1);//Mon Nov 21 14:46:43 CST 2016

        System.out.println(date1.compareTo(date));//1,标示date1大于date
        System.out.println(date1.after(date));//true
    }
}

其实Date对象原来是可以通过对应的set方法来设定其中的时间的(比如年,月,日等),但后面这些方法都被废除了,只剩下一些比较大小的方法可以使用。

2.DateFormat类
上面我们输出了Date类对象,可以看到输出的两种格式都不是很友好,那么我们能不能指定输出时间的格式呢。这时候就要用到DateFormat类及其子类了。
DateFormat类是一个抽象类,它有一个经常使用的子类SimpleDateFormat,这个类可以用来进行时间格式的转换。具体来说我们可以通过SimpleDateFormate对象将前面的date对象
以我们指定的时间格式输出,并且这个类还可以将以一定格式表示时间的字符串解析成时间对象。具体的用法见下面的代码:

public class DateTest {
    public static void main(String[] args) throws Exception{
        Date date = new Date();
        //将date解析为指定格式的字符串
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        System.out.println(format.format(date));//2016-08-01 07:15:34

        //将表示时间的字符串解析为date对象
        String txt = "2016-8-1 7:14:34";
        date = format.parse(txt);
        System.out.println(date.getTime());//1470006874000
    }
}

对于DateFormat来说比较重要的一点是什么格式是合法的,实际上DateFormat本身就有一套用于表示不同时间单位的字符,只要是我们使用这些字符组合成的格式,都是合法的。下面先给出具体的语法表示,然后通过代码来具体的说明这一点。
SimpleDateFormat函数语法:
G 年代标志符
y 年
d 日
H 时 在一天中 (0~23)
m 分
s 秒
E 星期
F 一月中第几个星期几
w 一年中第几个星期
W 一月中第几个星期
a 上午 / 下午 标记符
K 时 在上午或下午 (0~11)
z 时区

public class DateTest {
    public static void main(String[] args) throws Exception{
        Date date = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyy年的第w个星期,第D天,本月的第W个星期,k时,z时区");
        System.out.println(format.format(date));//2016年的第32个星期,第214天,本月的第1个星期,19时,CST时区
        SimpleDateFormat format1 = new SimpleDateFormat("yy年M月dd日 HH时mm分ss秒 E");
        System.out.println(format1.format(date));//16年8月01日 19时46分21秒 星期一

        //解析出错
       // String txt = "16年8月01天 19时39分37秒 星期一";
        //System.out.println(format1.parse(txt).getTime());

        //对解析格式要求严格点
        String txt = "2016/08/01 18:23:09";
        SimpleDateFormat format2 = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
        System.out.println(format2.parse(txt).getTime());//1470046989000
    }
}

可以看到对于将date解析成指定的格式字符串是非常自由的,我们基本可以随意指定;但是将字符串解析为date对象时,对格式的要求就要严格很多了,这时候就不允许再出现汉字了。

3.Calendar类
前面我们说过Date类中曾经有一些获取具体时间的方法(比如当前时间的小时、分钟等),但是这些方法目前都已经被废除了,为了进行这些操作我们就需要借助Calendar类了;除了上面说的这些操作外Calendar类还可以对时间进行加减操作和设定时间的具体部分(设定当前date对象的分钟、小时等),当然Calendar类是一个抽象类,我们使用到的是它的子类GregorianCalendar。具体的用法见下面的代码:

public class DateTest {
    public static void main(String[] args) throws Exception {
        Date date = new Date();
        Calendar calendar = new GregorianCalendar();

        //calendar.set(2016,8,1,20,07,23); 也可以使用这种方式来初始化一个Calendar对象
        calendar.setTime(date);

        //Calendar对象可以获取当前时间的指定部分,具体的时间段用Calendar中的常量表示
        System.out.println(calendar.get(Calendar.HOUR)); //8
        System.out.println(calendar.get(Calendar.MINUTE)); //22

        //Calendar对象可以对时间进行加减操作,可以指定加减的单位 
        System.out.println(calendar.get(Calendar.MINUTE)); //22
        calendar.add(Calendar.MINUTE, 20); //当前时间加20分钟
        System.out.println(calendar.get(Calendar.MINUTE)); //42
        calendar.add(Calendar.MINUTE, -30);//减30分钟
        System.out.println(calendar.get(Calendar.MINUTE)); //12

        //Calendar也可以将某个部分的时间设为指定值
        calendar.set(Calendar.YEAR, 2017); //设为2017年
        System.out.println(calendar.get(Calendar.YEAR));  //2017

        //Calendar类还有可以取得当前是一年的第几天,一个月第几天,一天的第几个小时
        System.out.println(calendar.get(Calendar.DAY_OF_YEAR)); //213
        System.out.println(calendar.get(Calendar.DAY_OF_MONTH)); //1
        System.out.println(calendar.get(Calendar.HOUR_OF_DAY)); //20
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值