目录
日期和时间
1.1 Date类
1.1.1 概述
java.util.Date类:表示特定的瞬间,精确到毫秒(千分之一秒),1000毫秒=1秒。毫秒值的作用,可以对时间和日期进行计算,先把日期转换为毫秒进行计算,计算完毕,再把毫秒转换为日期。
1.1.2 常用方法
构造方法:
Date():获取的就是当前系统的日期和时间。不格式化的情况显示格式是中国标准时间。
Date(Long date):传递毫秒值,把毫秒转换为Date日期。
成员方法:
Long getTime():把日期转换为毫秒值(相当于System.currentTimeMillis()),就是计算当前日期到时间原点之间一共经历了多少毫秒。
注:
1.时间原点(0毫秒):1970年1月1日00:00:00。
2.中国是属于东八区,会把时间增加8个小时,时间原点为:1970年1月1日08:00:00。
3.一天 = 24 * 60 * 60 = 86400秒 = 86400 * 1000 = 86400000毫秒
1.1.3 案例
要求:获取当前日期,将当前日期转换成毫秒值,并将毫秒值在转换成日期。
源代码:
package com.zhy.util;
import java.util.Date;
public class TestDate {
public static void main(String[] args) {
Date date = new Date();
System.out.println("获取当前日期和时间:" + date);
Long missValue = date.getTime();
System.out.println("日期 转换成 毫秒值:" + missValue);
Date date2 = new Date(missValue);
System.out.println("毫秒值 转换成 日期:" + date2);
}
}
输出结果:
1.2 DateFormat类
1.2.1 概述
java.text.DateFormat类:是日期/时间格式化子类的抽象类,我们通过这个类可以帮我们完成日期(Date对象)和文本(String对象)之间的转换,格式化(也就是日期转换为文本),解析(文本转换为日期)。
1.2.2 常用方法
DateFormat类是一个抽象类,无法直接创建对象使用,可以使用DateFormat的子类(java.text.SimpleDateFormat),常用的方法如下。
String format(Date date):按照指定的模式,把Date日期,格式化为符合模式的字符串。
Date parse(String source):把符合模式的字符串,解析为Date日期。
1.3 SimpleDateFormat类
1.3.1 概述
SimpleDateFormat是一个用于格式化和解析日期的类。它提供了一种简单而灵活的方式来将日期转换为特定格式的字符串,或将字符串解析为日期对象。
1.3.2 构造方法
格式:
SimpleDateFormat(String pattern);说明:用给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat。
参数pattern:传递指定的模式。
1.3.3 模式字符
SimpleDateFormat使用一系列模式字符来定义日期格式,这些模式字符可以代表年、月、日、小时、分钟、秒等各个部分的值。通过在SimpleDateFormat的构造函数中传入指定的日期格式模式,我们可以创建一个可以格式化和解析指定日期格式的SimpleDateFormat对象。
模式 | 说明 |
---|---|
y | 年 |
M | 月 |
d | 日 |
H | 时 |
m | 分 |
s | 秒 |
S | 毫秒 |
模式:区分大小写的,字母不可更改,连接模式的符号可以改变。
1.3.4 日期转字符串
使用SimpleDateFormat类的format()成员方法实现。
格式:
String format(Date date):把日期格式化为文本(按照指定的模式,把Date日期,格式化为符合模式的字符串)。
源代码:
package com.zhy.util;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestSimpleDateFormat {
public static void main(String[] args){
//1.创建SimpleDateFormat对象,构造函数中传递指定的模式。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy/MM/dd");
//2.调用SimpleDateFormat对象中的format方法,按照构造方法中指定的模式,把Date日期格式化为符合模式的字符串文本。
Date date = new Date();
System.out.println("没有格式化的日期:" + date);
String dateS = sdf.format(date);
System.out.println("使用模式 yyyy-MM-dd HH:mm:ss SSS 格式化日期:" + dateS);
String dateS2 = sdf2.format(date);
System.out.println("使用模式 yyyy/MM/dd 格式化日期:" + dateS2);
}
}
输出结果:
1.3.5 字符串转日期
使用SimpleDateFormat类的parse()成员方法实现。
格式:
Date parse(String source):把文本解析为日期(把符合模式的字符串,解析为Date日期)。
注意事项:
parse方法声明了一个异常,叫做ParseException(解析异常),如果字符串和构造方法中的模式不一样,那么程序就会抛出此异常,也就是编译报错,必须要处理,要么throws继续声明抛出这个异常,要么try…catch自己处理这个异常。
源代码:
package com.zhy.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestSimpleDateFormat {
public static void main(String[] args) throws ParseException {
//1.创建SimpleDateFormat对象,构造函数中传递指定的模式。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy/MM/dd");
//2.调用SimpleDateFormat对象中的parse方法,把符合构造方法中模式的字符串,解析为Date日期。
Date date = sdf.parse("2024-01-08 11:45:08");
System.out.println(date);
Date date2 = sdf2.parse("2024/01/08");
System.out.println(date2);
}
}
输出结果:
1.4 Calendar类
1.4.1 概述
java.util.Calendar类:日历类,Calendar类是一个抽象类,里面提供了很多操作日历字段的方法(YEAR、MONTH、DAY_of_MONTH、HOUR),Calendar类无法直接创建对象使用,里面有一个静态方法叫getInstance(),该方法返回了Calendar类的子类对象。
1.4.2 静态方法
public static Calendar getInstance():使用默认时区和语言环境获得一个日历。
//获取日历
Calendar c = Calendar.getInstance();
1.4.3 常用成员方法
public Date getTime():返回一个Date对象,表示此日历的时间值,默认当前日期。
public Date setTime(Date date):将此日历的时间设置为给定日期(date)。
package com.zhy.util;
import java.util.Calendar;
import java.util.Date;
public class CalendarTest {
public static void main(String[] args) {
//日历
Calendar c = Calendar.getInstance();
//第一次获取日历日期,默认当前日期
Date now = c.getTime();
//设置 当前日历时间 为 当前日期
c.setTime(now);
}
}
public void add(int field, int amount):根据日历的规则,在给定的日历字段中添加或减去指定的时间量。
package com.zhy.util;
import java.util.Calendar;
import java.util.Date;
public class CalendarTest {
public static void main(String[] args) {;
//日历
Calendar c = Calendar.getInstance();
//第一次获取日历日期,默认当前日期
Date now = c.getTime();
//将 日历的当前时间 设置成当前日期
c.setTime(now);
//1.从日历的当前时间,减去1年
c.add(Calendar.YEAR, -1);
c.setTime(now);
//2.从日历的当前时间,加上2个月
c.add(Calendar.MONTH, 2);
c.setTime(now);
//3.从日历的当前时间,减去10天
c.add(Calendar.DAY_OF_MONTH,-10);
}
}
public int get(int field):返回给定 日历字段(field) 的值。
public void set(int field,int value):将给定的 日历字段(field) 设置为 给定值(value)。public void set(int year, int month, int date):年月日。
public void set(int year, int month, int date, int hourOfDay, int minute):年月日时分。
public void set(int year, int month, int date, int hourOfDay, int minute,int second):年月日时分秒。
package com.zhy.util;
import java.util.Calendar;
public class CalendarTest {
public static void main(String[] args) {
//日历
Calendar c = Calendar.getInstance();
//1.设置 日历当前日期 的年份
c.set(Calendar.YEAR,2025);
//2.设置 日历当前日期 的年月日
c.set(2026,Calendar.MAY,19);
//3.设置 日历当前日期 的年月日时分
c.set(2027,Calendar.MAY,19,12,30);
//4.设置 日历当前日期 的年月日时分秒
c.set(2028,Calendar.MAY,19,12,30,59);
//5.获取 日历当前日期 的年份
int year = c.get(Calendar.YEAR);
System.out.println(year);
//6.获取 日历当前日期 的月份,取值:0-11(1月-12月)
int month = c.get(Calendar.MONTH);//month = 4,表示5月份
}
}
public int getFirstDayOfWeek():获取一周的第一天,默认值=1(星期日)。
public void setFirstDayOfWeek(int value):设置一周的第一天。
package com.zhy.util;
import java.util.Calendar;
public class CalendarTest {
public static void main(String[] args) {
//日历
Calendar c = Calendar.getInstance();
//1.获取一周的第一天,默认 值 = 1(星期日)
int firstDay= c.getFirstDayOfWeek();
//2.设置一周的第一天为周一
c.setFirstDayOfWeek(Calendar.MONDAY);
//3.再次获取,此时 值 = 2(星期一)
firstDay= c.getFirstDayOfWeek();
}
}
1.4.4 成员方法中参数field的常用取值
Calendar.ERA:纪元,取值:只能为0(代表公元前)或1(代表公元)
Calendar.YEAR:年
Calendar.MONTH:月
Calendar.DATE:一个月中的第几天,等同于Calendar.DAY_OF_MONTH
Calendar.HOUR:12小时制下的小时数,中午和午夜表示为0
Calendar.HOUR_OF_DAY:24小时制下的小时数,午夜表示为0
Calendar.MINUTE:分
Calendar.SECOND:秒
Calendar.MILLISECOND:毫秒
Calendar.AM_PM=0:时间是在中午之前还是之后,取值0(中午前)和1(中午后)
Calendar.DAY_OF_MONTH:一年中的第几天(判断当前日期是几月份),取值0-11(1月份-12月份)
一月:Calendar.JANUARY = 0
二月:Calendar.FEBRUARY = 1
三月:Calendar.MARCH = 2
四月:Calendar.APRIL = 3
五月:Calendar.MAY = 4
六月:Calendar.JUNE = 5
七月:Calendar.JULY = 6
八月:Calendar.AUGUST = 7
九月:Calendar.SEPTEMBER = 8
十月:Calendar.OCTOBER = 9
十一月:Calendar.NOVEMBER = 10
十二月:Calendar.DECEMBER = 11
Calendar.DAY_OF_MONTH:一个月中的第几天(判断当前日期是几号)
Calendar.DAY_OF_WEEK_IN_MONTH:这一天所对应的星期几在该月中是第几次出现(判断当前日期是这个月的第几个星期几)
Calendar.DAY_OF_WEEK:一周中的第几天(判断当前日期是周几),取值1-7(周日-周六)
星期日:Calendar.SUNDAY=1
星期一:Calendar.MONDAY=2
星期二:Calendar.TUESDAY=3
星期三:Calendar.WEDNESDAY=4
星期四:Calendar.THURSDAY=5
星期五:Calendar.FRIDAY=6
星期六:Calendar.SATURDAY=7
Calendar.WEEK_OF_YEAR:一年中的第几个星期
Calendar.WEEK_OF_MONTH:一个月中的第几个星期
Calendar.firstDayOfWeek:一周中的第一天,默认1(星期日)
1.4.5 练习
源代码:
package com.zhy.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class CalendarTest {
public static void main(String[] args) throws ParseException {
//日期格式化
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//获取日历
Calendar c = Calendar.getInstance();
//一、获取当前日期
Date now = c.getTime();
System.out.println("当前日期:" + sdf.format(c.getTime()));
System.out.println("=============================================");
//二、获取本周周五的日期
//1.设置 日历当前时间 为当前日期
c.setTime(now);
//2.设置当当前日历每周的第一天为周一,则:c.getFirstDayOfWeek()=2
c.setFirstDayOfWeek(Calendar.MONDAY);
//3.在 当前日期 的基础上,根据公式推算 当前日期 距离周五 的天数,进行日期偏移。
// c.get(Calendar.DAY_OF_WEEK):由于周日=1,为了符合数字和星期对应,每一天都要-1;
// 例如:周一的c.get(Calendar.DAY_OF_WEEK)=2,减一之后c.get(Calendar.DAY_OF_WEEK)=1,后面以此类推
c.add(Calendar.DATE, (c.getFirstDayOfWeek() - (c.get(Calendar.DAY_OF_WEEK) - 1) + 3));
//4.格式化日期
System.out.println("本周周五是:" + sdf.format(c.getTime()));
System.out.println("=============================================");
//三、获取一年三月个后的倒数第五天的日期
//1.设置日历为当前日期
c.setTime(now);
//2.在当前日期的基础上加上1年4个月
c.add(Calendar.YEAR,1);
c.add(Calendar.MONTH,4);
//3.往前倒数5天,0:倒数一天,-4:倒数5天
c.set(Calendar.DAY_OF_MONTH,-4);
//4.格式化日期
System.out.println("一年三个月后的倒数第五天是:" + sdf.format(c.getTime()));
}
}
输出结果: