Java Date和Calendar类
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
开发工具与关键技术:
作者:陈剑波
撰写时间:2019年07月28日
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Date和Calendar类
一、Date类
Java提供了Date类来处理日期、时间(此处的Date是指java.util包下的Date类,而不 是java.sql包下的Date类),Date对象既包含日期,也包含时间。Date类从JDK1.0起 就开始存在了,因为它历史悠久,所以它的大部分构造器、方法都已经过时,不再推荐使用了。
示例代码:
import java.text.ParseException; |
import java.text.SimpleDateFormat; |
import java.util.Date; |
|
/** |
* @author KO.ZERO Date类 在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所 |
* 以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理。 构造器 |
* Java.util.Date的构造器还剩下两个构造器,其他都已经过时(@Deprecated注解,表 示 |
* 已经不再推荐使用,使用会有警告,并且可以会导致程序性能或者安全性方面的问题) |
*/ |
public class DateClassDemo { |
public static void main(String[] args) { |
// Date():分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒),使用该构造方法创建的对象可以获取本地的当前时间。 |
Date date = new Date();// 构造器 |
System.out.println(date.toString()); |
System.out.println(date.clone());//clone():返回此对象的副本。 |
// equals(Object obj):比较两个日期是否相等。当且仅当参数不为空并且是一个日期对象,表示与该对象相同的时间点(以毫秒为单位)时,结果才为真。 |
System.out.println(date.equals(date.clone())); |
// getTime(): 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表 示的毫秒数。 |
System.out.println(date.getTime()); |
//setTime(long time):设置此 Date 对象,以表示 1970 年 1 月 1 日 00:00:00 GMT 以后 time 毫秒的时间点。 |
// date.setTime(0); |
// 分别使用Date类的构造方法创建两个Date对象。在创建完第一个 Date |
// 对象后,使用 Thread.sleep() 方法让程序休眠 60 秒,然后再创建第二个 Date |
// 对象,这样第二个 Date 对象所表示的时间将会在第一个 Date 对象所表示时间之后。 |
try { |
Thread.sleep(60000);// 暂停 1 分钟 |
} catch (InterruptedException e) { |
e.printStackTrace(); |
} |
// currentTimeMillis():返回以毫秒为单位的当前时间。该 方法是system中的方法。用来往数据库中存储时间的好方法! |
System.out.println(System.currentTimeMillis()); |
// Date(long date):分配 Date 对象并初始化此对象,以表示自从标准基准时间(称为“历元 |
// (epoch)”,即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数。 |
Date date2 = new Date(System.currentTimeMillis());// 构造器 |
System.out.println(date2); |
// 常用方法 |
// after(Date when):测试此日期是否在指定日期之后。 |
System.out.println(date.after(date2)); |
// before(Date when):测试此日期是否在指定日期之前。 |
System.out.println(date.before(date2)); |
//compareTo(Date anotherDate):比较两个日期的顺序。 |
//如果参数日期等于这个日期,则返回值0;如果日期在Date参数之前,则该值小于0;如果日期在Date参数之后,则值大于0。 |
System.out.println(date.compareTo(date2)); |
//通过向SimpleDateFormat 的构造函数传递格式字符串"yy-MM-dd HH:mm:ss", 我们就能够指明自己想要的格式。 |
//说明: yyyy-MM-dd-HH-mm:ss:ms 年yyyy 月MM 日dd 时(大写为24进制,小写为12进制)分mm 秒ss 微妙ms |
SimpleDateFormat dateFormat = new SimpleDateFormat("yy-MM-dd HH:mm:ss");//格式化当前系统日期 |
// format():方法可以把Date的数据类型转成特定格式的String类型数据 |
String string = dateFormat.format(date2); |
System.out.println(string); |
try {//parse():方法可以把String类型的字符串转成特定格式的Date类型数据 |
Date date3 = dateFormat.parse(string); |
System.out.println(date3); |
} catch (ParseException e) { |
// TODO Auto-generated catch block |
e.printStackTrace(); |
} |
} |
} |
运行结果:
Wed Aug 07 11:16:47 GMT+08:00 2019 |
Wed Aug 07 11:16:47 GMT+08:00 2019 |
true |
1565147807421 |
1565147867481 |
Wed Aug 07 11:17:47 GMT+08:00 2019 |
false |
true |
-1 |
19-08-07 11:17:47 |
Wed Aug 07 11:17:47 GMT+08:00 2019 |
二、Calendar类
由于Date类过于古老,许多的构造器和方法都已经过时。从JDK1.1版本开始,在处理日期和时间时,系统推荐使用Calendar类进行实现。在设计上,dar类的功能要比Date类强大很多,而且在实现方式上也比Date类要复杂一些。
示例代码:
import java.text.SimpleDateFormat; |
import java.util.Calendar; |
import java.util.Date; |
|
/** |
* @author KO.ZERO Calendar类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程 |
* 序员来说是透明的,只需要使用getInstance方法创建即可。 |
*/ |
public class CalendarClassDemo { |
public static void main(String[] args) { |
// getInstance():获取使用默认时区和区域设置的日历。返回的日历基于默认时区中的当前时间和默认地区。 |
Calendar calendar = Calendar.getInstance(); |
// 创建 Calendar对象后,可以通过 Calendar对象中的一些方法来处理日期、时间。 |
// Calendar类的常用方法 |
// get(int field):返回给定日历字段的值。 |
System.out.println("年:" + calendar.get(Calendar.YEAR));// 获取年份 |
// 月是从0开始(0~11),所以需要+1 |
// 0,表示当前日历是在 1 月份;如果值是 11,则表示当前日历在 12 月份。 |
System.out.println("月:" + (calendar.get(Calendar.MONTH) + 1)); |
System.out.println("日:" + calendar.get(Calendar.DAY_OF_MONTH)); |
System.out.println("时:" + calendar.get(Calendar.HOUR_OF_DAY)); |
System.out.println("分:" + calendar.get(Calendar.MINUTE)); |
System.out.println("秒:" + calendar.get(Calendar.SECOND)); |
// set(int field, int value):将给定的日历字段设置为给定值。该方法有多个重载 |
calendar.set(Calendar.YEAR, 2019); |
calendar.set(Calendar.MONTH, Calendar.MAY);// 使用英文的十二个月的单词 |
calendar.set(Calendar.DAY_OF_MONTH, 8); |
calendar.set(Calendar.HOUR_OF_DAY, 8);// 24小时制的小时 |
// Calendar.DAY_OF_WEEK:星期几 //Calendar.HOUR 12小时制的小时 |
calendar.set(Calendar.MINUTE, 8); |
calendar.set(Calendar.SECOND, 8); |
// getTime():返回一个表示此 Calendar 时间值(从历元至现在的毫 秒偏移量)的Date对象。 |
System.out.println(calendar.getTime()); |
// 格式化日期 |
SimpleDateFormat dateFormat = new SimpleDateFormat("yy-MM-dd HH:mm:ss"); |
String string = dateFormat.format(calendar.getTime()); |
System.out.println(string); |
// add(int field, int amount):根据日历的规则,为给定的日历字段添加或减去指定的 时间量。 |
calendar.add(Calendar.HOUR_OF_DAY, 5);// 加五个小时 |
String string2 = dateFormat.format(calendar.getTime()); |
System.out.println(string2); |
calendar.add(Calendar.HOUR_OF_DAY, -6);// 减六个小时 |
String string3 = dateFormat.format(calendar.getTime()); |
System.out.println(string3); |
// roll(int field, int amount):向指定日历字段添加指定(有符号的)时间量,不更改 更大的字段。 |
calendar.roll(Calendar.DATE, 7);// 加七天 |
System.out.println(calendar.getTime()); |
calendar.roll(Calendar.DATE, -9);// 减九天 |
//add方法会产生其他相关时间属性的连动变化 //roll方法只是对相应时间属性的域内做变化 |
System.out.println(calendar.getTime()); |
// Calendar 类型转换为 Date 类型: |
Date date = calendar.getTime(); |
// Date 类型转换为 Calendar 类型 |
calendar.setTime(date); |
//setTime(Date date):使用给定的 Date 设置此 Calendar 的时间。 |
calendar.setTime(new Date()); |
string = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SS")).format(calendar |
.getTime()); |
System.out.println(string); |
//compareTo(anotherCalendar):返回如果参数所表示的时间等于本日历所表示的时间,则为0;如果本日历的时间在参数所表示的时间之前,则为小于0的值; |
//如果该日历的时间在参数表示的时间之后,则该值大于0。 |
Calendar calendar2 = Calendar.getInstance(); |
string2 = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SS")).format(calendar2.getTime()); |
System.out.println(string2); |
calendar.add(Calendar.HOUR, -5);//减五个小时 |
System.out.println("时间比较:" + calendar.compareTo(calendar2)); |
} |
} |
运行结果:
年:2019 |
月:8 |
日:7 |
时:15 |
分:45 |
秒:1 |
Wed May 08 08:08:08 GMT+08:00 2019 |
19-05-08 08:08:08 |
19-05-08 13:08:08 |
19-05-08 07:08:08 |
Wed May 15 07:08:08 GMT+08:00 2019 |
Mon May 06 07:08:08 GMT+08:00 2019 |
2019-08-07 15:45:01:65 |
2019-08-07 15:45:01:65 |
时间比较:-1 |