浅析Date与Calendar

来源:互联网 发布:apache 跨域访问配置 编辑:程序博客网 时间:2024/05/16 23:37

 看其他东西看烦了,就翻着看看java基础,发现好多东西学了之后没有整理出来,现在再去看的话觉得好陌生,仿佛从来没看过一样……,今天就来总结一下java里面对于时间与日期的处理这部分的内容

  在这里就不详细介绍很早之前的时间度量方式了,感兴趣的小伙伴可以找找资料了解一下,现在就简单介绍一下Date和Calendar吧…

时间轴上瞬间的Date

 我们知道,想要取得系统时间,具体来说有两种方法:
   方法一是System.currentTimeMillis()方法,这个返回的是long类型的整数,代表的是1970年1月1日0时0分0秒0毫秒至今经过的毫秒数。
   方法二是使用Date实例来取得系统时间描述,不过,两种方法并没有什么大区别,Date也是偏向机器的时间观点.
 可以看出,这两种方法取得的是机器的时间观点,代表时间轴上的某一瞬间,但是需要思考的是,这一长串毫秒数对与我们人类的阅读有什么意义???

package com.Datetime;import java.util.Date;import static java.lang.System.currentTimeMillis;/** * Created by dongmengyuan on 17-8-9. */public class DateDemo {    public static void main(String[] args) {        Date date1 = new Date(currentTimeMillis());        Date date2 = new Date();        System.out.println(date1.getTime());        System.out.println(date2.getTime());    }}

诺,来看看计算机的回复:
这里写图片描述

emmmm…
 无疑是没有什么意义的,这就好比,你问计算机现在几点了,计算机给你返回一长串数字,想想都可怕…

格式化时间日期的DateFormat

 通过上面的简单介绍,可以发现,有关字符串时间格式的处理已经不再是Date的职责了,所以,这重任就落到了java.text.DateFormat身上。
 DateFormat是一个抽象类,他的操作类是java.text.SimpleDateFormat。
 我们有两种方式来操作它,第一种是直接构建SimpleDateFormat的实例,另一种是使用DateFormatgetDateInstance(),getTimeInstance(),getDateTimeInstance()等静态方法,用简便方式按不同需求取得SimpleDateFormat实例。
 现在先来看看如何通过DateFormat的各种静态方法来对字符串时间进行格式化操作。

package com.Datetime;import java.util.*;import static java.text.DateFormat.*;/** * Created by dongmengyuan on 17-8-15. */public class DateFormatDemo {    public static void main(String[] args) {        Date date = new Date();        dateInstanceDemo(date);        timeInstanceDemo(date);        dateTimeInstanceDemo(date);    }    static void dateInstanceDemo(Date date)    {        System.out.println("getDateInstance() demo:");        System.out.printf("\t: %s%n",getDateInstance(LONG).format(date));        System.out.printf("\t: %s%n",getDateInstance(SHORT).format(date));    }    static void timeInstanceDemo(Date date)    {        System.out.println("getTimeInstance() demo:");        System.out.printf("\t: %s%n",getTimeInstance(LONG).format(date));        System.out.printf("\t: %s%n",getTimeInstance(MEDIUM).format(date));        System.out.printf("\t: %s%n",getTimeInstance(SHORT).format(date));    }    static void dateTimeInstanceDemo(Date date)    {        System.out.println("getDateTimeStance() demo:");        System.out.printf("\t: %s%n",getDateTimeInstance(LONG,LONG).format(date));        System.out.printf("\t: %s%n",getDateTimeInstance(SHORT,MEDIUM).format(date));        System.out.printf("\t: %s%n",getDateTimeInstance(SHORT,SHORT).format(date));    }}

格式化结果是:
这里写图片描述

 getDateInstance(),getTimeIntance(),getDateTimeInstance()等静态方法主要是用来取得不同详细程度的日期时间。
 
 再来试试直接构建SimpleDateFormat的实例的方法

package com.Datetime;import java.util.*;import java.text.*;/** * Created by dongmengyuan on 17-8-15. */public class CurrentTime {    public static void main(String[] args) {        DateFormat dateFormat = new SimpleDateFormat(args.length == 0 ? "EE-MM-dd--yyyy" : args[0]);        System.out.println(dateFormat.format(new Date()));    }}

效果如下:
这里写图片描述

很容易看出,使用这种直接构建SimpleDateFormat实例的好处就是可以使用模式字符串自定义格式。

处理时间日期的Calendar

 如果想要取得某个时间日期信息,或是下想要对时间日期进行操作,可以使用Calendar实例。
 Calendar是一个抽象类,取得Calendar的实例后,可以使用getTime()取得Date实例,如果想要取得年月日等日期时间字段,可以使用get()方法并指定Calendar上的字段枚举常数,如:

System.out.println(Calendar.YEAR); //2017System.out.println(Calendar.MONTH); //7System.out.println(Calendar.DATE);  //15

 在这里需要注意的是:得到的数字是对应至Calendar在月份上的列举值,但是列举值的一月是从0数字开始,所以得到的月份数字比实际的月份在数值上小一

public final static int JANUARY = 0;public final static int FEBRUARY = 1;......public final static int DECEMBER = 11;

如果要设定时间日期等字段,不要对Date设定,应使用Calendar,同样,月份部分使用枚举常数设定。
如下:

Calendar calendar = Calendar.getInstance();calendar.set(2017,Calendar.AUGUST,15);     System.out.println(Calendar.YEAR);         //2017System.out.println(Calendar.MONTH);        //8System.out.println(Calendar.DATE);         //15

 在取得Calendar实例后,可以使用add()方法来改变Calendar的时间,如下:

//Calendar的时间加1个月Calendar.add(Calendar.MONTH,1);//Calendar的时间加3小时Calendar.add(Calendar.HOUR,3);//Calendar的时间减2年Calendar.add(Calendar.YEAR,-2);

 如果Calendar设定的时间是2014/2/28,(非闰年),Calendar.add(Calendar.DATE,1)的结果是2014/3/1。——计算结果是下一天应有的日期。
 但是如果我只想针对日期中某个字段计算呢?
  这时应该用roll()方法。
  例如,对于2014/2/28,想要只改变日字段,我们就选择使用roll()方法,Calendar.roll(Calendar.DATE,1)的结果是2014/2/1,可以看出也只是处理了日字段部分,因为2014年的2月没有29,所以实际上回到了1日.

设定Timezone

  在前面的示例中,都没有涉及到使用时区信息,这样的话是使用默认时区的,我们可以使用java.util.Timezone的getDefault()来取得默认时区信息,如:

package com.Datetime;/** * Created by dongmengyuan on 17-8-15. */import java.util.TimeZone;public class TimezoneDemo {    public static void main(String[] args) {        TimeZone timezone = TimeZone.getDefault();        System.out.println(timezone.getDisplayName());        System.out.println("\t时区ID:" + timezone.getID());        System.out.println("\t日光节约时数:" + timezone.getDSTSavings());        System.out.println("\tUTC偏移毫秒数:" + timezone.getRawOffset());    }}

结果:
这里写图片描述
 
 当然,你要是想取得指定地区的TimeZone实例,可以使用ID字符串,如:

TimeZone taipeiTz = TimeZone.getTimeZone("Asia/Taipei");        TimeZone copenhagenTz = TimeZone.getTimeZone("Europe/Copenhagen");

 嗯,这块东西大概就是这样啦,总结一下,方便回忆!