如果我们想在Java中获取当前的时间,可以使用 java.util.Date类
和 java.util.Calendar
类来实现。其中,Date类封装了系统的日期和时间信息,Calendar
类则会根据系统的日历来填充Date对象。
java.util.Date是一个表示日期和时间的类,代表了系统特定的时间戳。它是按照UTC时间显示的,可以精确到毫秒,源码内部使用long类型进行时间的存储。我们要注意与java.sql.Date区分,后者是用在数据库中的类,且是按照本地时区显示的。Date对象表示的时间,其默认顺序是星期、月、日、小时、分、秒、年。
2. 构造方法
java.util.Date类给我们提供了多个构造方法,如下图所示:
但是一般在开发时,我们常用的也没有这么多,一般使用时如下形式:
● Date():创建Date对象并初始化,该对象可以获取本地的当前时间,该时间会精确到毫秒。
● Date(long date):构造一个Date对象,并接受一个从1970年1月1日起的毫秒数作为参数。
3. 常用API方法
当我们构造出来一个Date对象之后,就可以使用它的一些API方法进行时间的操作了,这些常用的API方法如下:
序号 | 方法和描述 |
---|---|
boolean after(Date date) | 若调用该方法的Date对象,在指定的日期之后,则返回true,否则返回false。 |
boolean before(Date date) | 若调用此方法的Date对象,在指定的日期之前,则返回true,否则返回false。 |
int compareTo(Date date) | 比较调用此方法的Date对象和指定的日期。若两者相等则返回0,若该对象在指定日期之前则返回负数,若该对象在指定日期之后则返回正数。 |
boolean equals(Object date) | 若调用该方法的Date对象,和指定日期相等时则返回true,否则返回false。 |
long getTime( ) | 返回自1970年1月1日 00:00:00 GMT以来的毫秒数。 |
void setTime(long time) | 用从1970年1月1日00:00:00 以后的time毫秒数,设置时间和日期。 |
String toString( ) | 把该Date对象转换成dow mon dd hh:mm:ss zzz yyyy格式的字符串,其中dow是指一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。 |
4. 使用方法
4.1 基本使用
接下来我们先通过一个简单的案例,来演示一下Date的基本用法。
import java.util.Date;
public class Demo01 {
public static void main(String[] args) {
//获取当前时间的时间戳
long currentTimeMillis = System.currentTimeMillis();
System.out.println("时间戳="+currentTimeMillis);
//获取当前时间对象
Date date=new Date();
//Sat Feb 11 12:04:03 IRKT 2023
System.out.println("当前时间="+date);
//转为字符串:Sat Feb 11 12:04:03 IRKT 2023
System.out.println("当前时间="+date.toString());
//转换为本地时区:2023年2月11日 下午12:04:03
System.out.println("当前时间,Locale="+date.toLocaleString());
//转换为GMT时区:11 Feb 2023 04:04:03 GMT
System.out.println("当前时间,GMT="+date.toGMTString());
}
}
如果我们想获取当前时间的时间戳,可以使用System.currentTimeMillis()方法。构造出Date对象之后,我们可以直接打印该对象,就能展示出当前时间,但是这个格式并不一定符合我们中国人的阅读习惯,后面我们可以对日期进行格式化操作。
4.2 其他用法
除了上面这些基本用法之外,Date还有其他的一些用法。
import java.util.Date;
public class Demo01 {
public static void main(String[] args) {
//获取当前时间对象
Date date=new Date();
//获取年月日
System.out.println("年="+(date.getYear() + 1900)); // 必须加上1900
System.out.println("月="+(date.getMonth() + 1)); // 0~11,必须加上1
System.out.println("日="+date.getDate()); // 1~31,不能加1
System.out.println("时="+date.getHours()); // 0~23
System.out.println("分="+date.getMinutes()); // 0~59,不能加1
System.out.println("秒="+date.getSeconds()); // 0~59,不能加1
System.out.println("时间戳="+date.getTime()); // 时间戳,毫秒值
//计算自己已经活了多少天,1990年01月31日
//构造对象的另一个方法,已过时。year:要减去1900,月份从0开始,0-11;日期是1-31
Date d1 = new Date(1990-1900, 2-1, 31);
Date d2 = new Date();
long time = d2.getTime() - d1.getTime();
System.out.println("已活天数="+time/1000/60/60/24);
}
}
另外我们还要注意,getYear()方法返回的年份必须加上1900;getMonth()方法返回的月份是0-11,分别表示1-12月,所以要加1;而getDate()方法返回的日期范围是1~31,就不能加1。
在打印本地时区表示的日期和时间时,不同的计算机可能会有不同的展示结果,后面我们可以使用SimpleDateFormat设置出我们想要的日期时间格式。
4.3 统计时间差
有时候我们要统计某个功能的执行时间,此时就可以用该功能结束时的时间,减去开始时的时间,得到一个时间差,这就是该功能的执行时间。
import java.util.Date;
public class Demo03 {
public static void main(String[] args) {
//获取当前时间对象
//开始时间
Date startDate=new Date();
for(int i=0;i<100000;i++) {
System.out.println("循环次数"+i);
}
//结束时间
Date endDate=new Date();
//计算时间差
long time = endDate.getTime() - startDate.getTime();
System.out.println("10w次循环的执行时间是 "+time+" 毫秒");
}
}
三. Calendar日历类
1. 简介
Calendar类是Java时间类Date的扩展。
相比Date,它拥有更强大的功能,主要是多了可以做简单日期和时间运算的功能,且在实现方式上也比Date类更复杂一些。Calendar可以用来计算日期,比如说计算下个月的日期,或者两个月前的日期等。
Calendar类
是一个抽象类,我们在实际使用时需要实现特定的子类,一般使用getInstance()
方法创建即可。Calendar
类有几个主要的子类,包括java.util.GregorianCalendar和java.util.TimeZone
。其中GregorianCalendar
类提供了标准的日历系统,可以用来计算未来或过去某天的日期。TimeZone类则可以用来在不同的时区之间,转换日期和时间。
2. Calendar常量字段
Calendar中有以下几个常用的常量字段,用于表示不同的意义。
常量 | 描述 |
---|---|
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 | 星期几 |
3. Calendar常用方法
除了以上常用的常量字段之外,Calendar还有一些常用的方法,如下表所示:
方法 | 描述 |
---|---|
void add(int field, int amount) | 根据日历的规则,为给定的日历字段 field 添加或减去指定的时间量 amount |
boolean after(Object when) | 判断此 Calendar 表示的时间是否在指定时间 when 之后,并返回判断结果 |
boolean before(Object when) | 判断此 Calendar 表示的时间是否在指定时间 when 之前,并返回判断结果 |
void clear() | 清空 Calendar 中的日期时间值 |
int compareTo(Calendar anotherCalendar) | 比较两个 Calendar 对象表示的时间值(从格林威治时间 1970 年 01 月 01 日 00 时 00 分 00 秒至现在的毫秒偏移量),大则返回 1,小则返回 -1,相等返回 0 |
int get(int field) | 返回指定日历字段的值 |
int getActualMaximum(int field) | 返回指定日历字段可能拥有的最大值 |
int getActualMinimum(int field) | 返回指定日历字段可能拥有的最小值 |
int getFirstDayOfWeek() | 获取一星期的第一天。根据不同的国家地区,返回不同的值 |
static Calendar getInstance() | 使用默认时区和语言坏境获得一个日历 |
static Calendar getInstance(TimeZone zone) | 使用指定时区和默认语言环境获得一个日历 |
static Calendar getInstance(TimeZone zone,Locale aLocale) | 使用指定时区和语言环境获得一个日历 |
Date getTime() | 返回一个表示此 Calendar 时间值(从格林威治时间1970 年 01 月 01 日 00 时 00 分 00 秒至现在的毫秒偏移量)的 Date 对象 |
long getTimeInMillis() | 返回此 Calendar 的时间值,以毫秒为单位 |
void set(int field, int value) | 为指定的日历字段设置给定值 |
void set(int year, int month, int date) | 设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值 |
void set(int year, int month, int date, int hourOfDay,int minute, int second) | 设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、 MINUTE 和 SECOND 的值 |
void setFirstDayOfWeek(int value) | 设置一星期的第一天是哪一天 |
void setTimeInMillis(long millis) | 用给定的 long 值设置此 Calendar 的当前时间值 |
Calendar对象可以调用set()方法将日历翻到任何一个时间,当参数 year取负数时表示是公元前。调用 get()方法可以获取年、月、日等时间信息,field参数的值是前面讲过的Calendar静态常量。
4. 构建Calendar对象
Calendar类是抽象类,所以我们不能通过new的方式来构建Calendar对象。在实际使用时,我们一般是要实现特定的子类,经常是使用getInstance()方法进行创建。
import java.util.Calendar;
public class Demo04 {
public static void main(String[] args) {
//默认是当前日期
Calendar c1 = Calendar.getInstance();
System.out.println("c1="+c1);
//创建一个代表2023年2月2日的Calendar对象
Calendar c2 = Calendar.getInstance();
c2.set(2023, 2-1, 2);
System.out.println("c2="+c2);
}
}
5. 获取当前时间
获取到Calendar对象之后,我们可以获取到当前日期对象的年月日时分秒等信息。
import java.util.Calendar;
public class Demo05 {
public static void main(String[] args) {
// 获取当前时间
Calendar c = Calendar.getInstance();
int y = c.get(Calendar.YEAR);
//月份要加1
int m = 1 + c.get(Calendar.MONTH);
int d = c.get(Calendar.DAY_OF_MONTH);
int w = c.get(Calendar.DAY_OF_WEEK);
int hh = c.get(Calendar.HOUR_OF_DAY);
int mm = c.get(Calendar.MINUTE);
int ss = c.get(Calendar.SECOND);
int ms = c.get(Calendar.MILLISECOND);
//2023-2-11 7 18:10:59.847
System.out.println(y + "-" + m + "-" + d + " " + w + " " + hh + ":" + mm + ":" + ss + "." + ms);
}
}
我们要注意,Calendar是通过get()方法获取年月日等信息的,其中返回的年份不必转换,返回的月份仍要加1,返回的星期要特别注意,1~7分别表示周日、周一、……周六。
6. 设置时间
我们通过Calendar.getInstance()方法获取到Calendar对象后,获取到的其实就是当前时间。如果我们想设置某个特定的日期和时间,需要先用clear()方法清除掉之前所有的字段。
import java.util.Calendar;
public class Demo06 {
public static void main(String[] args) {
// 设置时间
Calendar c = Calendar.getInstance();
// 清除所有
c.clear();
// 设置2023年
c.set(Calendar.YEAR, 2023);
// 设置2月(0~11)
c.set(Calendar.MONTH, 1);
// 设置2日
c.set(Calendar.DATE, 2);
// 设置时间
c.set(Calendar.HOUR_OF_DAY, 21);
### 给大家的福利
**零基础入门**
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
![](https://img-blog.csdnimg.cn/img_convert/95608e9062782d28f4f04f821405d99a.png)
同时每个成长路线对应的板块都有配套的视频提供:
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a91b9e8100834e9291cfcf1695d8cd42.png#pic_center)
因篇幅有限,仅展示部分资料
网络安全面试题
![](https://img-blog.csdnimg.cn/img_convert/80674985176a4889f7bb130756893764.png)
绿盟护网行动
![](https://img-blog.csdnimg.cn/img_convert/9f3395407120bb0e1b5bf17bb6b6c743.png)
还有大家最喜欢的黑客技术
![](https://img-blog.csdnimg.cn/img_convert/5912337446dee53639406fead3d3f03c.jpeg)
**网络安全源码合集+工具包**
![](https://img-blog.csdnimg.cn/img_convert/5072ce807750c7ec721c2501c29cb7d5.png)
![](https://img-blog.csdnimg.cn/img_convert/4a5f4281817dc4613353c120c9543810.png)
**所有资料共282G**,朋友们如果有需要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码领取(如遇扫码问题,可以在评论区留言领取哦)~
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**