目录
- Date:时间
- SipmleDateFormat:格式化时间
- Calendar:日历对象
Date
在学习之前我们先来做个知识扩展吧:
-
世界标准时间:
- 格林尼治时间/格林威治时间(Greenwich MeanTime)简称 GMT,目前世界标准时间(UTC)已经替换为:原子钟
-
时间单位换算:
- 1秒1000毫秒
- 1毫秒1000微秒
- 1微秒1000纳秒
-
Date类
- Date类是一个JDK写好的Javabean类,用来描述时间,精确到秒。
- 利用空参构造创建的对象,默认表示系统当前时间。
- 利用有参构造创建的对象,表示指定的时间。
构造方法
| 构造方法 | 说明 |
|---|---|
| public Date() | 构造一个Date,使用默认格式 |
| public Date(long time) | 构造一个Date,使用指定的格式 |
下面我们来实操一下吧:
- 创建对象表示一个时间
//1.创建对象表示一个时间
Date d1=new Date();
System.out.println(d1);
- 创建对象表示一个指定的时间
//2.创建对象表示一个指定的时间
Date d2 =new Date(0L); // 0秒就表示从时间原点过去了多少秒
System.out.println(d2);
- setTime 修改时间
// 3.setTime 修改时间
d2.setTime(1000L);
System.out.println(d2);
怎么样,是不是成功修改了1秒呀。
- getTime获取当前时间的毫秒值
// 4.getTime获取当前时间的毫秒值
long time =d2.getTime();
System.out.println(time);
时间1000毫秒就等于1秒,所以会打印一个1000出来。
下面我们大概了解了,那接下来做两个小小练习练一下吧:
- 需求一:打印时间原点开始一年之后的时间
- 创建一个对象,表示时间原点
Date d1 = new Date(0L);
2. 取d1时间的毫秒值
long time = d1.getTime();
3. 在这个基础上我们要加一年的毫秒值即可
time = time + 1000L * 60 * 60 * 24 * 365;
4. 把计算之后的时间毫秒值,再设置回d1当中
d1.setTime(time);
5. 打印
System.out.println(d1);
下面我们来运行看一下:
可以看到打印出了1971年1月1日 8:00,是不是过去了一年的时间呀!我们再来看第二个!
- 需求二:定义任意两个Date对象,比较一下哪个时间在前,哪个在后
- 利用随机生成两个时间
Random r = new Random();
Date d1 = new Date(Math.abs(r.nextInt()));
Date d2 = new Date(Math.abs(r.nextInt()));
2. 获取毫秒值
long time1 = d1.getTime();
long time2 = d2.getTime();
3. 比较
if(time1 > time2){
System.out.println("第一个时间在后面,第二个时间在前面");
}else if(time1< time2){
System.out.println("第二个时间在后面,第一个时间在前面");
}else{
System.out.println("表示两个时间一样");
}
我们来看一下:
时间比较是不是通过毫秒来比较的呀,下面我们就会来学习怎么样转为真正的时间进行比较了。
-
下面我们来做个总结吧:
- 如何创建日期对象?
-
Date date=new Date();
-
Date date =new Date(指定毫秒值);
-
- 如何修改时间对象中的毫秒值
- setTime(毫秒值):
- 如何获取时间对象中的毫秒值
- gettime();
- 如何创建日期对象?
SipmleDateFormat
- SimpleDateFormat 类作用
- 格式化:把时间变成我们喜欢的格式。
- 解析:把字符串表示的时间变成Date对象。
我们之前打印的时间是不是都是这种格式呢:
这种打印是不是,不太好看呢,那下面我们就来学习SimpleDateFormat的格式化,变成我们想要的样子吧:
先来了解一下他的构造方法和成员方法吧:
构造方法
| 构造方法 | 说明 |
|---|---|
| public simpleDateFormat() | 构造一个SimpleDateFormat,使用默认格式 |
| public simpleDateFormat(string pattern) | 构造-个simpleDateFormat,使用指定的格式 |
我们来实操一下看看:
利用空参构造创建对象
SimpleDateFormat sdf1 = new SimpleDateFormat();
Date d1 = new Date(0L);
String str1 = sdf1.format(d1);
System.out.println(str1);
这个时候我们来运行看一下:
怎么样,是不是把时间原点用另外一种格式打印出来了呀,对比上面的那种打印应该这种更易懂吧!接着看:
利用带参构造创建对象
//2.利用带参构造创建simpleDateFormat对象,指定格式
SimpleDateFormat sdf2 = new SimpleDateFormat( "yyyy年MM月dd日 HH:mm:ss");
String str2=sdf2.format(d1);
System.out.println(str2);
来运行看一下:
怎么样,是不是把年月日都给加上去打印出来了呀,那我想要打印星期几怎么打印呢?其实也是只需要在后面拼接周的字母E就可以了哟:
SimpleDateFormat sdf2 = new SimpleDateFormat( "yyyy年MM月dd日 HH:mm:ss EE");
我们来看一下:
到这里我们就学习完毕构造方法啦,下面我们来看一下成员方法吧:
成员方法
| 构造方法 | 说明 |
|---|---|
| public final string format(Date date) | 格式化(日期对象->字符串) |
| public Date parse(string source) | 解析(字符串->日期对象) |
来实操一下看看带给我们的乐趣:
parse(string source) 解析(字符串->日期对象)
//1.定义一个字符串表示时间
String str = "2023-11-11 11:11:11";
//2.利用空参构造创建simpleDateFormat对象
SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse(str);
System.out.println(date);
这里我们运行看一下:
是不是已经把date时间解析出来了呀,然后就可以调用里面的getTime方法获取出当前时间的毫秒值:
System.out.println(date.getTime());
是不是也一样解析出时间的毫秒值了呀。有了毫秒值之后就可以拿他来进行加减判断啦。
- 这边有个小细节:创建对象的格式要跟字符串的格式完全一致
到这里就学完啦,下面我们还是来做两个小小的练习题吧:
- 需求一:假设,你初恋的出生年月日为:2000-11-11,请用字符串表示这个数据,并将其转换为:2000年11月11日
- 定义一个字符串表示时间
String str="2000-11-11";
2. 解析字符串
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf1.parse(str);
3. 格式化输出
SimpleDateFormat sdf2 = new SimpleDateFormat( "yyyy年MM月dd日");
String result= sdf2.format(date);
System.out.println(result);
我们来运行看一下:
是不是和需求的时间格式一模一样呀,我们接着看下一个吧!
- 需求二:某活动秒杀开始开始时间:2023年11月11日 0:00:00,结束时间:2023年11月11日 0:10:00。张三下单并付款的时间为:2023年11月11日 0:05:58,用代码说明张三有没有参与上秒杀活动。
- 定义三个字符串表示开始时间和结束时间以及下单时间
String startStr = "2023年11月11日 0:00:00";
String endStr = "2023年11月11日 0:10:00";
String orderStr = "2023年11月11日 0:05:58";
2. 解析三个字符串时间得到Date对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date startDate = sdf.parse(startStr);
Date endDate = sdf.parse(endStr);
Date orderDate = sdf.parse(orderStr);
3. 得到三个毫秒值
long startTime = startDate.getTime();
long endTime = endDate.getTime();
long orderTime = orderDate.getTime();
4. 判断
if (orderTime >= startTime && orderTime <= endTime) {
System.out.println("参加秒杀活动成功");
} else {
System.out.println("参加秒杀活动失败");
}
我们来运行看一下吧:
在开始和结束这段时间内下单的是不是都参与成功了呀,到这里SipmleDateFormat就学完啦,我们接着往下看!
Calendar
我们前面学习了Date和SipmleDateFormat方法,而这个Calendar是干什么的呢?我们来看一个需求:
需求:将2023年11月11日增加一个月变成2023年12月11日。
我们以前的写法是不是要先定义字符串表示2023年11月11日。解析字符串得到Date对象。获取2023年11月11日的毫秒值。增加一个月的毫秒值:100060602430.在格式化时间变成2023年12月11日。那这样写也太麻烦了呀,有没有一种更简单的方法呢?其实是有的,Calendar的作用是表示相同当前时间的日历对象,可以单独修改年月日。
Calendar概述
Calendar代表了系统当前时间的日历对象,可以单独修改、获取时间中的年、月、日。
细节:Calendar是一个抽象类,不能直接创建对象。
获取Calendar对象方法
| 方法名 | 说明 |
|---|---|
| public static Calendar getInstance() | 获取当前时间的日历对象 |
我们来实操一下看看:
// 1.获取口历对象
// 细节:Calendar是一个抽象类,不能直接new,而是通过一个静态方法获取到子类对象
Calendar c=Calendar.getInstance();
System.out.println(c);
我们来运行看一下:
是不是就直接把我们当前系统的日期给获取出来了呀。但是目前是12月份,为什么打印出来的是11月份呢?我们来了解一下他的底层原理吧:
- 会根据系统的不同时区来获取不同的日历对象,默认表示当前时间。
- 把会把时间中的纪元,年,月,日,时,分,秒,星期,等等的都放到一个数组当中
- 月份:范围0-11,如果获取出来的是0,那么实际上是1月份。
- 星期:在老外眼里,星期日是一周的第一天,所以会从星期日开始计算
- 1.星期日 2.星期一 3.星期二 4.星期三 5.星期四 6.星期五 7.星期六
成员方法
| 方法名 | 说明 |
|---|---|
| public final Date getTime() | 获取日期对象 |
| public final setTime(Date date) | 给日历设置日期对象 |
| public long getTimeInMillis() | 拿到时间毫秒值 |
| public void setTimeInMillis(long millis) | 给日历设置时间毫秒值 |
| public int get(int field) | 取日历中的某个字段信息 |
| public void set(int field,int value) | 修改日历的某个字段信息 |
| public void add(int field,int amount) | 为某个字段增加/减少指定的值 |
下面我们也来实操一下吧:
// 修改一下日历代表的时间
Date d = new Date(0L);
c.setTime(d);
System.out.println(c);
我们下面来看后面三个吧:
取日历中的年月日字段信息
我们可以看到他给我们返回的是一个数组,那对应的下标分别表示什么呢?我们来看一下:
0:纪元 1:年 2:月 3:一年中的第几周 4:一个月中的第几周 5:一个月中的第几天(日期)
我们既然是要取年月日,那是不是获取到对应的1,2,5就可以啦。我们来试一下:
Calendar c = Calendar.getInstance();
int year = c.get(1);
int month = c.get(2);
int date = c.get(5);
他为什么打印出来的是11月份呢?刚才是不是说了月份的范围是0到11呀,打印出来的如果是0,其实是一月份,所以说要在月份获取出来的基础上+1,那这个才是真实的月份。
int month = c.get(2) + 1;
下面我们来说个小细节:Java在Calendar类中,把索引对应的数字都定义成了常量。 虽然写数字也没错,但是不美观,所以我们可以去看一下他的常量有哪些:
是不是都是一一对应的呀,下面我们来改一下把:
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1;
int date = c.get(Calendar.DATE);
到这里就直接获取到了年月日的信息。那我还想获取星期几怎么办呢?其实也是一样的呢:
int week = c.get(Calendar.DAY_OF_WEEK);
我们来看一下,他返回了一个3,但是今天是星期二呀,我们前面是不是说了老外是从星期日开始计算的呀,3对应的其实就是星期二哟。那我想要他输出的信息和中文的一样怎么办呢?其实我们可以定义一个查表法来获取定义的星期哟:
定义查表法,让数据跟索引产生定义的关系:
public static String getweek(int index){
// 1。定义一个数组让汉字星期几跟1-7产生对应的关系
String[] arr = {"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
// 2.根据索引返回对应的星期
return arr[index];
}
我们也来改一下输出的那里,调用一个getweek方法:
System.out.println(year + "-" + month + "-" + date + "-" + getweek(week));
这个时候来看一下:
怎么样,是不是就一样了呀!既然我们获取到了想要的字段,那下面我们就可以单独拿某一个字段进行修改啦。
修改某字段信息
需求:将年改成2025年,月改成6月分,日改为18日。
// 修改日历的某个字段信息
c.set(Calendar.YEAR,2025);
c.set(Calendar.MONTH,5);
c.set(Calendar.DATE,18);
我们来运行看一下:
怎么样,是不是成功对某个字段进行修改了呀。
为某字段增加/减少值
需求:将上面信息2025年6月18日单独增加二个月。
// 为某个字段增加/减少指定的值
c.add(Calendar.MONTH,2);
是不是增加了2个月呀,那这里我传入一个负数看一下:
c.add(Calendar.MONTH,-2);
他的时间是不是就往前减了一个月呀,所以这个细节我们需要掌握。
下面我们来总结一下吧:
- Calendar:表示一个时间的日历对象。
- 如何获取对象:通过getInstance方法获取对象
- 常用方法:setXxx:修改,getXxx:获取,add:增加或者减少
- 细节点:日历类月份范围0-11,星期的特点:星期日是一周的第一天
好啦,到这里JDK7以前的时间日期相关类就学习完毕啦,有什么不懂的可以评论区一起互相探讨,我们下期不见不散!
==最后非常感谢您的阅读,也希望能得到您的反馈 ==