您的位置:首页 > 编程语言 > Java开发

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

2016-08-02 20:13 281 查看
日期的处理是一个很常见的问题,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
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 日期处理