Java—— 常见API介绍 第四期
时间的相关知识点
1.世界标准时间:
格林尼治时间/格林威治时间(Greenwich Mean Time)简称 GMT。
目前世界标准时间(UTC)已经替换为:原子钟
2.中国标准时间:
世界标准时间+8小时
中国计算机中的时间原点
1970年1月1日 08:00:00
3.时间单位换算:
1秒 = 1000毫秒
1毫秒 = 1000微秒
1微秒 = 1000纳秒
JDK7前时间相关类
Date | 时间 |
SimpleDateFormat | 格式化时间 |
Calendar | 日历 |
Date时间类
说明:
Date 类是一个JDK写好的Javabean类,用来描述时间,精确到毫秒。
利用空参构造创建的对象,默认表示系统当前时间。
利用有参构造创建的对象,表示指定的时间。
构造方法:
方法名 | 说明 |
public Date() | 创建Date对象,表示当前时间 |
public Date(long date) | 创建Date对象,表示指定时间 |
常见成员方法:
方法名 | 说明 |
public void setTime (long time) | 设置/修改毫秒值 |
public long getTime ( ) | 获取时间对象的毫秒值 |
代码演示:
public class Test1 {public static void main(String[] args) {//空参构造,表示当前时间Date d1 = new Date();System.out.println(d1);//Fri Apr 25 11:21:13 CST 2025//带参构造,参数为long类型的整数,代表毫秒值//结果表示计算机时间原点加参数传递的毫秒值//计算机时间原点为 1970年1月1日 08:00:00Date d2 = new Date(0L);System.out.println(d2);//Thu Jan 01 08:00:00 CST 1970Date d3 = new Date(1000L);System.out.println(d3);//Thu Jan 01 08:00:01 CST 1970//设置/修改毫秒值d2.setTime(2000L);System.out.println(d2);//Thu Jan 01 08:00:02 CST 1970//获取时间对象的毫秒值long time1 = d1.getTime();System.out.println(time1);//1745551858290long time2 = d2.getTime();System.out.println(time2);//2000long time3 = d3.getTime();System.out.println(time3);//1000}
}
练习:
需求:
需求1:打印时间原点开始一年之后的时间
需求2:定义任意两个Date对象,比较一下哪个时间在前,哪个时间在后
代码实现:
public class Test2 {public static void main(String[] args) {//需求1:打印时间原点开始一年之后的时间//需求2:定义任意两个Date对象,比较一下哪个时间在前,哪个时间在后//需求1//创建Date对象d,传递0毫秒,表示时间原点Date d = new Date(0L);System.out.println(d);//Thu Jan 01 08:00:00 CST 1970//获取时间原点d的时间毫秒值long time = d.getTime();//在此基础上增加一年time = time + 1000L * 60 * 60 * 24 * 365;//增加后再设置回d中d.setTime(time);System.out.println(d);//Fri Jan 01 08:00:00 CST 1971System.out.println("-----------------------");//需求2//创建两个Date对象,参数为随机正整数Random r = new Random();Date d1 = new Date(Math.abs(r.nextInt()));Date d2 = new Date(Math.abs(r.nextInt()));System.out.println(d1);//Wed Jan 21 14:34:30 CST 1970System.out.println(d2);//Sun Jan 25 23:14:25 CST 1970//获取时间对象的毫秒值long time1 = d1.getTime();long time2 = d2.getTime();//进行比较if (time1 > time2) {System.out.println("时间1在后面");} else if (time1 < time2) {System.out.println("时间2在后面");} else {System.out.println("两时间相同");}//时间2在后面}
}
SimpleDateFormat类
作用:
格式化:把时间变成我们喜欢的格式。例如:2023年10月1日,2023-10-1,2023/10/1
解析:把字符串表示的时间变成Date对象。
格式化的时间形式的常用的模式对应关系:
y | 年 |
M | 月 |
d | 日 |
H | 时 |
m | 分 |
s | 秒 |
举例:
2023-11-11 13:27:06
yyyy-MM-dd HH:mm:ss
其他不常用的模式对应关系:

构造方法:
方法名 | 说明 |
public SimpleDateFormat () | 构造一个SimpleDateFormat, 使用默认格式 |
public SimpleDateFormat (String pattern) | 构造一个SimpleDateFormat, 使用指定的格式 |
常见成员方法:
方法名 | 说明 |
public final string format (Date date) | 格式化(日期对象 -字符串) |
public Date parse (String source) | 解析(字符串 ->日期对象) |
代码演示:
public class Test3 {public static void main(String[] args) throws ParseException {//创建时间原点对象Date d = new Date(0L);//空参构造,使用默认格式SimpleDateFormat sdf1 = new SimpleDateFormat();//进行格式化String str1 = sdf1.format(d);System.out.println(str1);//1970/1/1 上午8:00//带参构造,使用指定的格式SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//进行格式化String str2 = sdf2.format(d);System.out.println(str2);//1970-01-01 08:00:00//解析String str = "2020-10-10 10:10:10";//创建对象的格式要和字符串所对应的格式一模一样SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//进行解析Date date = sdf.parse(str);System.out.println(date);//Sat Oct 10 10:10:10 CST 2020}
}
练习:
需求:
按照指定格式展示
假设,你的出生年月日为:2000-11-11
请用字符串表示这个数据,并将其转换为:2000年11月11日
代码实现:
public class Test4 {public static void main(String[] args) throws ParseException {String str = "2000-11-11";//先将其解析为时间类型SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");Date date = sdf1.parse(str);//再将其格式化SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日");String result = sdf2.format(date);System.out.println(result);//2000年11月11日}
}
Calendar
说明:
Calendar代表了系统当前时间的日历对象,可以单独修改、获取时间中的年,月,日
细节:Calendar是一个抽象类,不能直接创建对象。
常见成员方法:
方法名 | 说明 |
public static Calendar getInstance() | 获取当前时间的日历对象 |
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) | 为某个字段增加/减少指定的值 |
注意事项:
1: Calendar是一个抽象类,不能直接new,而是通过一个静态方法获取到子类对象
底层原理:会根据系统的不同时区来获取不同的日历对象,默认表示当前时间。
把会把时间中的纪元,年,月,日,时,分,秒,星期,等等的都放到一个数组当中例如:
0索引:纪元
1索引:年 Calendar.YEAR2索引:月 Calendar.MONTH
3索引:一年中的第几周
4索引:一个月中的第几周
5索引:一个月中的第几天(日期) Calendar.DATE.......
2:月份:范围0~11,如果获取出来的是0,那么实际上是1月。
星期:国外习惯,星期日是一周中的第一天
1(星期日),2(星期一),3(星期二),4(星期三),5(星期四),6(星期五),7(星期六)
代码演示:
public class Test5 {public static void main(String[] args) {//获取当前时间的日历对象Calendar c = Calendar.getInstance();System.out.println(c);//...YEAR=2025,MONTH=3....//获取日期对象Date d1 = c.getTime();System.out.println(d1);//Fri Apr 25 15:04:45 CST 2025//给日历设置日期对象,设置为时间原点Date d2 = new Date(0L);c.setTime(d2);System.out.println(c);//...YEAR=1970,MONTH=0....//拿到时间毫秒值,因为上面设置成了时间原点,所以结果为0long timeInMillis = c.getTimeInMillis();System.out.println(timeInMillis);//0//给日历设置时间毫秒值,设置一个月的毫秒值c.setTimeInMillis(1000L * 60 * 60 * 24 * 31);System.out.println(c);//...YEAR=1970,MONTH=1....//取日历中的某个字段信息//根据索引对应某个字段/*int year = c.get(1);int month = c.get(2);int date = c.get(5);System.out.println(year+"年"+(month+1)+"月"+date+"日");//1970年2月1日*/int year = c.get(Calendar.YEAR);int month = c.get(Calendar.MONTH);int date = c.get(Calendar.DATE);System.out.println(year + "年" + (month + 1) + "月" + date + "日");//1970年2月1日//修改日历的某个字段信息c.set(Calendar.YEAR, 2020);System.out.println(c.get(Calendar.YEAR));//2020//为某个字段增加/减少指定的值c.add(Calendar.YEAR, 1);System.out.println(c.get(Calendar.YEAR));//2021c.add(Calendar.YEAR, -3);System.out.println(c.get(Calendar.YEAR));//2018}
}