Java时间处理1----Date和Calendar方法探究(Java8以前)

前言

时间的处理在Java中会经常用到,Java中常用的时间处理类有如下两种:

  • Date: 日期类
    • 用来表示瞬时时间,精确到毫秒,他表示的是某一刹那的时间。Date不存在时区概念。
    • 由于Date类不易于实现国际化,所以逐渐不被推荐使用,并且废弃了大部分方法。
  • Calendar: 日历类,可以理解为计算机历
    • 一方面是为了弥补Date的国际化缺陷,另一方面是将时间以日历的形式来表示和处理
    • Calendar包含时区和语言的概念
    • Calendar将时间细分成了年月日时分秒毫秒上午下午夏时令等概念,并提供这些概念的相关操作方法。

下面我们来康康这两个工具类的一些常用方法。

Date 📅

Date类位于java.util包下,是JDK中最早的时间处理类,但由于Date类不易于实现国际化,后不被推荐使用。

Date源自于JDK1.0,到如今Date类中的大部分构造函数和方法都已经废弃不推荐使用(Deprecated)

目前还在使用的方法如下:

方法 : 返回值参数说明功能
Date()构造器当前时间的Date对象
Date(long date)构造器,date:与GMT1970年1月1日00:00:00之间的时间差(ms)创建指定时间的Date对象
after(Date when):booleanwhen:待判断的Date对象某一Date是否在when之后
before(Date when):booleanwhen:待判断的Date对象某一Date是否在when之前
compareTo(Date anotherDate):intanotherDate:待比较的Date对象Date对象与参数中的Date进行比较 ,
a.compareTo(b):a>b:正数, a=b:0,a<b:负数
getTime():long返回Date对象的时间戳
setTime(long time):voidtime:时间戳设置Date对象的时间

Date对象的使用示例如下

import java.util.Date;
/**
 * 描述:
 * Date的常用方式
 *
 * @author larscheng
 * @date 2019/11/21 13:46
 */
public class DateTest {
    public static void main(String[] args) {
        Date date1  = new Date();
        Date date2 = new Date(System.currentTimeMillis()+1000);
        System.out.println("date1: "+date1);//date1: Thu Nov 21 13:54:52 CST 2019
        System.out.println("date2: "+date2);//date2: Thu Nov 21 13:54:53 CST 2019
        System.out.println("date1.compareTo(date2): "+date1.compareTo(date2));//-1
        System.out.println("date1.after(date2): "+date1.after(date2));//false
        System.out.println("date1.before(date2): "+date1.before(date2));//true
        System.out.println("date1.getTime(): "+date1.getTime());//1574315692607
        date1.setTime(System.currentTimeMillis());
        System.out.println("setTime() ==> date1.getTime(): "+date1.getTime());//1574315692628
    }
}

Calendar 📆

在JDK1.1后,处理时间时,推荐使用Calendar类,Calendar包含Date中所有的功能,并且比Date更复杂更强大。

Calendar是一个抽象类,不可以直接实例化它,但可以通过他提供的getInstance方法进行创建

Calendar类在Date原有功能基础上,加强了对时间的处理和自定义等。其常用方法如下:

方法 : 返回值参数说明功能
getInstance():Calendar对外提供Calendar的创建入口
(该方法还有两个重载方法
主要用于自定义时区,语言环境)
after(Object when):booleanwhen:待判断的Calendar对象某一Date是否在when之后
before(Object when):booleanwhen:待判断的Calendar对象某一Date是否在when之前
compareTo(Calendar a):inta:待比较的Calendar对象Date对象与参数中的Date进行比较 ,
a.compareTo(b):a>b:正数, a=b:0,a<b:负数
getTime():Date将Calendar日期对象转换为Date对象
setTime(Date date):voiddate:Date对象将Date对象表示的时间值设置给Calendar日期对象
getTimeInMillis():long返回Calendar日期对象的时间戳
setTimeInMillis(long millis):voidmillis:时间戳用给定long值设置日历的当前时间
get(int field):intfield:日历字段(Calendar.YEAR)获取指定日历字段的值
set(int field, int val):voidfield:日历字段,val:具体值设置日历字段的值
add(int field, int amount):voidfield:日历字段,amount:加减值基于日历的规则实现日期加减。amout可为负数
roll(int field, boolean up):voidfield:日历字段,up:T加/F减在指定日历字段上添加或减去1个时间单元
roll(int field, int amount):voidfield:日历字段,amount:加减值在指定日历字段上添加或减去指定的时间单元

以上仅仅是Calendar类中的一部分常用方法,更多详细的方法大家可以参考源码

Calendar类是基于日历的时间处理类,在使用他之前需要注意下面一些小细节:

  • Calendar.MONTH: 初始值为0,最大值11,所以在格式化时间时记得+1

  • 在使用set方法时,Calendar.HOUR为12小时制,Calendar.HOUR_OF_DAY为24小时制

  • add与roll都可以实现指定字段的加减,两者的区别在于add会进位而roll不会,例子如下:

          //add与roll的区别
    	  SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
          Calendar ca1 = Calendar.getInstance();//2019-11-21 16:24:31
          Calendar ca2 = Calendar.getInstance();//2019-11-21 16:24:31
          ca1.add(Calendar.MONTH,3);//add加3个月
          ca2.roll(Calendar.MONTH,3);//roll加3个月
          System.out.println(sf.format(ca1.getTime()));//进位:2020-02-21 16:24:31
          System.out.println(sf.format(ca2.getTime()));//不进位:2019-02-21 16:24:31
    

Calendar类的常用方法使用示例如下:

add

        //add:基于日历规则实现日期加减
        System.out.println("#################### add #####################");
        Calendar cal = Calendar.getInstance();
        System.out.println("当前月份:"+(cal.get(Calendar.MONTH)+1));
        cal.add(Calendar.MONTH,2);
        System.out.println("加上2个月:"+(cal.get(Calendar.MONTH)+1));
        cal.add(Calendar.MONTH,-2);
        System.out.println("再加上-2个月:"+(cal.get(Calendar.MONTH)+1));

set

        //set:设置日历字段的值
        System.out.println("#################### set #####################");
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR,2018);
        System.out.println("修改年份后:"+calendar.get(Calendar.YEAR));
        calendar.set(2018, Calendar.MAY,13,15,1,11);
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime()));

get

        //get:返回指定日历字段的值
        System.out.println("#################### get #####################");
        System.out.println("当前日期:"+calendar.get(Calendar.YEAR)+"-"+calendar.get(Calendar.MONTH)
                +"-"+calendar.get(Calendar.DATE));
        System.out.println("当前时间:"+calendar.get(Calendar.HOUR_OF_DAY)+":"+calendar.get(Calendar.MINUTE)
                +":"+calendar.get(Calendar.SECOND)+":"+calendar.get(Calendar.MILLISECOND));
        System.out.println("12小时制:"+calendar.get(Calendar.HOUR));
        System.out.println("24小时制:"+calendar.get(Calendar.HOUR_OF_DAY));

总结

本文主要对时间处理类进行了方法梳理和说明,实际的使用中还会掺杂着时区和时间格式化等操作。

下篇文章我们接着来了解下Java中时区类TimeZone的基本使用。

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页