Java编程那些事儿78——时间和日期处理惩罚
副标题#e#
9.6 java.util包
java.util包是Java语言提供的东西类包,该包中包括了如日期、随机数和数据布局实现类等一系列的东西类实现,是进修Java语言的基本包之一。
本部门就以Java语言中常用的时间和日期处理惩罚、随机数处理惩罚以及荟萃框架为基本举办先容。
9.6.1 时间和日期处理惩罚
利用措施举办时间和日期处理惩罚,是措施员必需的一种常用技术,在差异的措施设计语言中提供了差异的名目举办实现,此刻就先容一下Java语言中的实现方法,以及根基的应用,使得对付Java语言的时间和日期处理惩罚技能有较量全面的认识。
在措施中,某个牢靠的时间代表的都是一个时间点,也就是一个时间的瞬间,譬喻2009年3月8日15点50分0秒,在实际的应用中,常常需要对付两个时间举办较量或计较时间之间的差值,这些成果在Java语言中都可以很利便的实现。
在Java语言中,时间的表达单元是毫秒。也就是说,Java语言中的时间处理惩罚可以准确到毫秒。
在Java语言中,表达时间的方法有两种:
a、绝对时间。以直观的形式来表达某个时间点,譬喻2009年10月10号0点0分0秒。利用这种形式表达时间,利用起来较量直观,可是不利便举办时间之间的计较。譬喻无法很直观的计较2020年1月1号0点0分0秒和上面这个时间之间相差几多天。绝对时间以工具的形式举办表达,Java API中提供了java.util包中的Date类和Calendar类的工具举办表达。
b、相对时间。以一个long型的数字表达某个时间点。譬喻102847423468。利用这种方法的优缺点和绝对时间恰好相反。这种方法很利便时间之间的计较,可是阅读起来很不直观。在Java API中以需要表达的时间点,譬喻2009年10月10号0点0分0秒,和GMT(格林威治时间,也就是伦敦时间)1970年1月1号0点0分0秒之间相差的毫秒数作为相对时间的数值,假如该时间在这个时间只好,则相对时间为正数,不然相对时间为负数。Java API中提供了java.lang包中的System类的currentTimeMillis要领,得到以相对时间形式描写的当前系统时间。
在实际利用时,绝对时间和相对时间之间可以很利便的举办转换。
9.6.1.1 Date类
在JDK1.0中,Date类是独一的一个代表时间的类,可是由于Date类未便于实现国际化,所以从JDK1.1版本开始,推荐利用Calendar类举办时间和日期处理惩罚。这里简朴先容一下Date类的利用。
1、利用Date类代表当前系统时间
Date d = new Date();
System.out.println(d);
利用Date类的默认结构要领建设出的工具就代表当前时间,由于Date类包围了toString要领,所以可以直接输出Date范例的工具,显示的功效如下:
Sun Mar 08 16:35:58 CST 2009
在该名目中,Sun代表Sunday(周日),Mar代表March(三月),08代表8号,CST代表China Standard Time(中国尺度时间,也就是北京时间(东八区))。
2、利用Date类代表指定的时间
Date d1 = new Date(2009-1900,3-1,9);
System.out.println(d1);
利用带参数的结构要领,可以结构指定日期的Date类工具,Date类中年份的参数应该是实际需要代表的年份减去1900,实际需要代表的月份减去1今后的值。譬喻上面的示例代码代表就是2009年3月9号。
实际代表详细的年代日时分秒的日期工具,和这个雷同。
#p#副标题#e#
3、得到Date工具中的信息
Date d2 = new Date();
//年份
int year = d2.getYear() + 1900;
//月份
int month = d2.getMonth() + 1;
//日期
int date = d2.getDate();
//小时
int hour = d2.getHours();
//分钟
int minute = d2.getMinutes();
//秒
int second = d2.getSeconds();
//礼拜几
int day = d2.getDay();
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);
利用Date类中对应的get要领,可以得到Date类工具中相关的信息,需要留意的是利用getYear得到是Date工具中年份减去1900今后的值,所以需要显示对应的年份则需要在返回值的基本上加上1900,月份雷同。在Date类中还提供了getDay要领,用于得到Date工具代表的时间是礼拜几,Date类划定周日是0,周一是1,周二是2,后续的依次类推。
4、Date工具和相对时间之间的互转
#p#分页标题#e#
Date d3 = new Date(2009-1900,3-1,10);
long time = 1290876532190L;
//将Date类的工具转换为相对时间
long t = d3.getTime();
System.out.println(t);
//将相对时间转换为Date类的工具
Date d4 = new Date(time);
System.out.println(d4);
利用Date工具中的getTime要领,可以将Date类的工具转换为相对时间,利用Date类的结构要领,可以将相对时间转换为Date类的工具。颠末转换今后,既利便了时间的计较,也使时间显示较量直观了。
9.6.1.2 Calendar类
从JDK1.1版本开始,在处理惩罚日期和时间时,系统推荐利用Calendar类举办实现。在设计上,Calendar类的成果要比Date类强大许多,并且在实现方法上也比Date类要巨大一些,下面就先容一下Calendar类的利用。
Calendar类是一个抽象类,在实际利用时实现特定的子类的工具,建设工具的进程对措施员来说是透明的,只需要利用getInstance要领建设即可。
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代表,配置成的值。譬喻:
c1.set(Calendar.DATE,10);
该代码的浸染是将c1工具代表的时间中日期配置为10号,其它所有的数值会被从头计较,譬喻礼拜几以及对应的相对时间数值等。
3、得到Calendar类中的信息
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);
利用Calendar类中的get要领可以得到Calendar工具中对应的信息,get要领的声明如下:
public int get(int field)
个中参数field代表需要得到的字段的值,字段说明和上面的set要领保持一致。需要说明的是,得到的月份为实际的月份值减1,得到的礼拜的值和Date类纷歧样。在Calendar类中,周日是1,周一是2,周二是3,依次类推。
4、其它要领说明
其实Calendar类中还提供了许多其它有用的要领,下面简朴的先容几个常见要领的利用。
a、add要领
public abstract void add(int field,int amount)
该要领的浸染是在Calendar工具中的某个字段上增加或淘汰必然的数值,增加是amount的值为正,淘汰时amount的值为负。
譬喻在计较一下当前时间100天今后的日期,代码如下:
#p#分页标题#e#
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天今后的日期,譬喻措施的输出功效大概为:
2009年6月17日
b、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,该要领是判定当前日期工具是否位于别的一个日期工具之前。
c、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要领配置时间即可。
9.6.1.3 应用示例
下面以两个简朴的示例先容时间和日期处理惩罚的根基利用。
1、计较两个日期之间相差的天数
譬喻计较2010年4月1号和2009年3月11号之间相差的天数,则可以利用时间和日期处理惩罚举办计较。
该措施实现的道理为:首先代表两个特定的时间点,这里利用Calendar的工具举办代表,然后将两个时间点转换为对应的相对时间,求两个时间点相对时间的差值,然后除以1天的毫秒数(24小时X60分钟X60秒X1000毫秒)即可得到对应的天数。实现该示例的完整代码如下:
import java.util.*;
/**
* 计较两个日期之间相差的天数
*/
public class DateExample1 {
public static void main(String[] args) {
//配置两个日期
//日期:2009年3月11号
Calendar c1 = Calendar.getInstance();
c1.set(2009, 3 - 1, 11);
//日期:2010年4月1号
Calendar c2 = Calendar.getInstance();
c2.set(2010, 4 - 1, 1);
//转换为相对时间
long t1 = c1.getTimeInMillis();
long t2 = c2.getTimeInMillis();
//计较天数
long days = (t2 - t1)/(24 * 60 * 60 * 1000);
System.out.println(days);
}
}
2、输出当前月的月历
该示例的成果是输出当前系统时间地址月的日历,譬喻当前系统时间是2009年3月10日,则输出2009年3月的日历。
该措施实现的道理为:首先得到该月1号是礼拜几,然后得到该月的天数,最后利用流程节制实现凭据日历的名目举办输出即可。即假如1号是礼拜一,则打印一个单元的空格,假如1号是礼拜二,则打印两个单元的空格,依次类推。打印完礼拜六的日期今后,举办换行。实现该示例的完整代码如下:
#p#分页标题#e#
import java.util.*;
/**
* 输出当前月的日历
*/
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();
}
}
关于时间和日期的处理惩罚就先容这么多,更多的实现要领还需要按照详细问题举办对应的实现。