Java编程那些事儿78——时间和日期处理惩罚
当前位置:以往代写 > JAVA 教程 >Java编程那些事儿78——时间和日期处理惩罚
2019-06-14

Java编程那些事儿78——时间和日期处理惩罚

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类的工具。颠末转换今后,既利便了时间的计较,也使时间显示较量直观了。

#p#副标题#e#

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号,其它所有的数值会被从头计较,譬喻礼拜几以及对应的相对时间数值等。

#p#副标题#e#

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,依次类推。

#p#副标题#e#

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,该要领是判定当前日期工具是否位于别的一个日期工具之前。

#p#副标题#e#

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要领配置时间即可。

#p#副标题#e#

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);

 }

}

#p#副标题#e#

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();

 }

}

关于时间和日期的处理惩罚就先容这么多,更多的实现要领还需要按照详细问题举办对应的实现。

    关键字:

在线提交作业