Java中操作时间日期的类有:Date
(日期)、Calendar
(日历)、DateFormat
(日期格式)。
一、Date
java.util.Date
,表示特定的瞬间,精确到毫秒。
1、构造方法
很久以前,Date类的构造方法有:
Date(int year, int month, int date)
Date(int year, int month, int date, int hrs, int min)
Date(String s)
等等……
然而这些方法早就过时,从JDK1.1开始,就只保留了以下两种构造方法:
-
Date()
不用多说,new 出来的 Date 就是当前时间。 -
Date(long date)
分配 Date 对象并初始化此对象,入参为从历元(即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数。
2、Date类常用方法
序号 | 方法 | 描述 |
---|---|---|
1 | boolean after(Date date) | 若当调用此方法的Date对象在指定日期之后返回true,否则返回false |
2 | boolean before(Date date) | 若当调用此方法的Date对象在指定日期之前返回true,否则返回false |
3 | int compareTo(Date date) | 比较当调用此方法的Date对象和指定日期。两者相等时候返回0。调用对象在指定日期之前则返回负数。调用对象在指定日期之后则返回正数 |
4 | boolean equals(Object date) | 当调用此方法的Date对象和指定日期相等时候返回true,否则返回false |
5 | long getTime() | 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数 |
6 | void setTime(long time) | 用时间戳设置时间和日期 |
7 | String toString() | 把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat) |
3、日期比较
可以使用以下三种方法对两个日期进行比较:
-
使用
getTime()
方法获取两个日期(自1970年1月1日经历的毫秒数值),然后比较这两个值 -
使用方法
before()
,after()
和equals()
。例如,一个月的12号比18号早,则:
new Date(99, 2, 12).before(new Date (99, 2, 18)) // 返回true
- 使用
compareTo()
方法,它是由Comparable
接口定义的,Date 类实现了这个接口。
4、使用SimpleDateFormat格式化日期
Date date=new Date(); System.out.println(date); //Sun Dec 31 15:00:08 CST 2017 SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(format.format(date)); //2017-12-31 15:00:08 format=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a zzz"); System.out.println(format.format(date)); //2017-12-31 03:00:08 PM CST
5、获取一个指定时间的Date对象
可以使用Calendar
的getTime()
方法,返回一个表示此 Calendar 时间值(从历元至现在的毫秒偏移量)的 Date 对象。
后面有讲。
二、Calendar
我们现在已经能够格式化并创建一个日期对象了,但是我们如何才能设置和获取日期数据的特定部分呢,比如说小时,日,或者分钟? 我们又如何在日期的这些部分加上或者减去值呢? 答案是使用Calendar类。
java.utiI.Calendar
,是一个抽象类,
用于设置和获取日期/时间数据的特定部分。
Calendar类提供一些方法和静态字段来操作日历。
1、获取Calendar对象
Calender是抽象类,所以不能被实例化,可以使用Calendar的getInstance()
方法获取Calendar对象:
Calendar calendar = Calendar.getInstance(); //默认是当前日期
2、Calendar常用方法
序号 | 方法 | 描述 |
---|---|---|
1 | int get(int field) | 返回给定日历字段的值,参数为常量,可以得到:年、月、日、小时、分钟、星期几 |
2 | void set(int year, int month, int date) | 设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值 |
3 | void set(int year, int month, int date, int hourOfDay, int minute) | 设置日历字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值 |
4 | void set(int year, int month, int date, int hourOfDay, int minute, int second) | 设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值 |
5 | void setTime(Date date) | 使用给定的 Date 设置此 Calendar 的时间 |
6 | Date getTime() | 返回一个表示此 Calendar 时间值的 Date 对象 |
7 | void add(int field, int amount) | 根据日历的规则,为给定的日历字段添加或减去指定的时间量 |
8 | int getActualMaximum(int field) | 返回当前月份的天数,参数为Calendar.DATE |
2.1 Calendar常量
常量 | 描述 |
---|---|
Calendar.YEAR | 年 |
Calendar.MONTH | 月 |
Calendar.DAY_OF_MONTH | 日 |
Calendar.DATE | 日,和Calendar.DAY_OF_MONTH完全相同 |
Calendar.HOUR | 小时(12小时制) |
Calendar.HOUR_OF_DAY | 小时(24小时制) |
Calendar.MINUTE | 分钟 |
Calendar.SECOND | 秒 |
Calendar.DAY_OF_WEEK | 星期几 |
注意:
月+1,周-1.
西方表示的月和我们有些不一样,第一个月用的是0表示,要获得准确的月就要+1;
星期几的话,一周的第一天应该是星期日,因此1代表星期日、2代表星期1、3代表星期二…
如果想将1表示为星期一的话,那么周就需要-1.
3、Calendar类对象信息的获得
月份的正常值范围为0-11,0表示一月,以此类推。星期是从星期天开始计算,星期天为1,以此类推。日期的正常值范围为1-31,结尾数字视月份而定。
Calendar calendar=Calendar.getInstance(); int year=calendar.get(Calendar.YEAR); int month=calendar.get(Calendar.MONTH)+1; int day=calendar.get(Calendar.DAY_OF_MONTH); int hour=calendar.get(Calendar.HOUR_OF_DAY); int minute=calendar.get(Calendar.MINUTE); int second=calendar.get(Calendar.SECOND); int week=calendar.get(Calendar.DAY_OF_WEEK)-1; System.out.println("现在是:"+year+"年"+month+"月"+day+"日 "+hour+":"+minute+":"+second+" 星期"+week); //现在是:2017年12月31日 15:57:39 星期0 //-1之后,0表示星期日
4、给Calendar对象设置指定日期
Calendar calendar=Calendar.getInstance(); //设置为:2017年10月1日 22:59:59 //在设置时间是,月要-1 calendar.set(2017,10-1,1,22,59,59);
5、使用add()方法修改时间
//今天 Calendar calendar=Calendar.getInstance(); int year=calendar.get(Calendar.YEAR); int month=calendar.get(Calendar.MONTH)+1; int day=calendar.get(Calendar.DAY_OF_MONTH); int week=calendar.get(Calendar.DAY_OF_WEEK)-1; String[] currentDay={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"}; System.out.println("今天是:"+year+"年"+month+"月"+day+"日 "+currentDay[week]); //今天是:2017年12月31日 星期日 //1天后 calendar.add(Calendar.DAY_OF_MONTH,+1); //往后推移一天 year=calendar.get(Calendar.YEAR); month=calendar.get(Calendar.MONTH)+1; day=calendar.get(Calendar.DAY_OF_MONTH); week=calendar.get(Calendar.DAY_OF_WEEK)-1; System.out.println("明天是:"+year+"年"+month+"月"+day+"日 "+currentDay[week]); //明天是:2018年1月1日 星期一
6、获取当月的天数
Calendar calendar=Calendar.getInstance(); int year=calendar.get(Calendar.YEAR); int month=calendar.get(Calendar.MONTH)+1; System.out.println("今天是:"+year+"年"+month+"月"); System.out.println("本月一共有"+calendar.getActualMaximum(Calendar.DAY_OF_MONTH)+"天");
三、GregorianCalendar类
Calendar类实现了公历日历,GregorianCalendar是Calendar类的一个具体实现。
Calendar
的getInstance()
方法,返回的就是一个默认用当前的语言环境和时区初始化的GregorianCalendar
对象。
1、GregorianCalendar类常用构造方法
序号 | 方法 | 描述 |
---|---|---|
1 | GregorianCalendar() | 在具有默认语言环境的默认时区内使用当前时间构造一个默认的 GregorianCalendar |
2 | GregorianCalendar(int year, int month, int date) | 创建指定日期的GregorianCalendar |
3 | GregorianCalendar(int year, int month, int date, int hour, int minute) | 创建指定日期的GregorianCalendar |
4 | GregorianCalendar(int year, int month, int date, int hour, int minute, int second) | 创建指定日期的GregorianCalendar |
2、GregorianCalendar类常用方法
和“Calendar常用方法”基本一致,毕竟是其实现类。
但还有个特有方法:boolean isLeapYear(int year)
,确定给定的年份是否为闰年。
因此不要向上转型,否则不能调用此方法。
3、确定当年是否为闰年
//首先不能向上转型,这里要使用实现类GregorianCalendar作为引用 GregorianCalendar calendar=new GregorianCalendar(2024,10-1,1); int year=calendar.get(Calendar.YEAR); boolean isLeapYear=calendar.isLeapYear(year); if(isLeapYear) System.out.println("当前年份是闰年"); else System.out.println("当前年份是平年");
四、Date、String、Calendar类型之间的转化
1、Date 转 Calendar
Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date());
2、Calendar 转 Date
Calendar calendar = Calendar.getInstance(); Date date = calendar.getTime();
3、Date 转 String
这个没什么好说的,SimpleDateFormat
格式化。
4、String 转 Date
使用SimpleDateFormat
类的parse(String str)
方法将字符串转为Date。
String str="2010-5-27"; SimpleDateFormat format= new SimpleDateFormat("yyyy-MM-dd"); Date date = format.parse(str);
5、Calendar 转 String
两种方法:
- 使用
Calendar.get()
方法取到年月日信息,然后+""; Calendar.getTime()
拿到Date对象,然后SimpleDateFormat
格式化。
6、String 转 Calendar
先使用SimpleDateFormat.parse(String str)
方法将字符串转为Date类型,然后使用Calendar.setTime(Date date)
方法。
五、计算两个日期相差了多少天
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd"); try { Date $start=simpleDateFormat.parse("2017-1-1"); Date $end=simpleDateFormat.parse("2019-1-1"); Calendar start=Calendar.getInstance(); Calendar end=Calendar.getInstance(); start.setTime($start); end.setTime($end); int day = end.get(Calendar.DAY_OF_YEAR) - start.get(Calendar.DAY_OF_YEAR); int resultYear=(end.get(Calendar.YEAR) - start.get(Calendar.YEAR))*365; int result=day+resultYear; System.out.println("相差"+result+"天"); } catch (ParseException e) { e.printStackTrace(); }
摘自: