18.JDK7以前的时间类(Date、SimpleDateFormat、Calendar)
JDK7以前的时间类
-
Date类
-
- 1. Date概述
- 2. 常用构造方法
- 3. 常用方法
- 4. 代码示例
-
日期时间格式化类
-
- 日期时间格式化类概述
-
- 构造函数介绍
-
- 格式规范说明
-
- 常见功能解析
-
- 典型应用分析
-
-
Calendar类
- 1. Calendar类概述
- 2. 构造函数
- 3. 主要方法
- 4. 获取相关属性的方法示例
- 5. 设置属性的方法示例
- 6. 添加事件的方法示例
- 7. 综合实例分析
具体信息请查看 API 帮助文档
Date类
1. Date概述
Date实体是Java编程语言中一个内置类,用于表达日期与时间的信息。该类包含于java.util包内。该类提供了处理与操作日期与时间的能力。支持获取当前时间和特定时刻的方法。允许比较不同时间和格式化显示这些信息的方式。
该类实例代表自标准基准时间起点(通称为‘纪元’)起始的具体日期与时间。其精确度可达到毫秒级精度。该类提供了若干方法用于获取与设置日期时间和其组成部分(包括年份、月份、日期、小时、分钟以及秒等)。
注意到的是 Date 类存在一些问题。具体而言,在处理日期和时间时该类采用基于计算机系统的本地时间处理机制而非依据时区计算。此外 绝大多数方法已弃用 不再推荐继续使用 Date 类。建议采用新的 Java 8 时间段库作为替代方案。
2. 常用构造方法
public Date(): 表示从当前运行时刻至时间起点所经历的毫秒数,并将其转换为 Date 对象实例。通过构造函数创建并初始化该 Date 对象实例,并从而精确记录该对象被创建的时间点。
public Date(long epochTime):该方法接受一个表示自标准基准时间(称为"历元(epoch)"),即1970年1月1日午夜格林尼治均时起算的指定毫秒数的长整型参数 epochTime,并将其赋值给 Date 对象 并初始化该对象。
tips: 中国位于东八区(GMT+08:00),即比世界协调时间/格林尼治时间(GMT)快了8个小时。当世界协调时间为午夜时分(即Greenwich Mean Time为零点),此时东八区的时间则为早上8点。
通过无参构造,默认会根据当前系统时间设置毫秒精度的时刻值;当需要时,可以通过指定long类型的参数来精确设定所需的毫秒数值。
例如:
import java.util.Date;
public class Demo01Date {
public static void main(String[] args) {
// 创建日期对象,把当前的时间
System.out.println(new Date()); // Tue Jan 16 14:37:35 CST 2020
// 创建日期对象,把当前的毫秒值转成日期对象
System.out.println(new Date(0L)); // Thu Jan 01 08:00:00 CST 1970
}
}
tips:当调用println方法时,会内部调用日期类中的toString方法。日期类实现了Object类中的toString方法,因此返回特定格式的字符串。
3. 常用方法
public long getTime() 把日期对象转换成对应的时间毫秒值。
该方法将时间字段设为指定的时间值
示例代码
public class DateDemo02 {
public static void main(String[] args) {
//创建日期对象
Date d = new Date();
//public long getTime():获取的是日期对象从1970年1月1日 00:00:00到现在的毫秒值
//System.out.println(d.getTime());
//System.out.println(d.getTime() * 1.0 / 1000 / 60 / 60 / 24 / 365 + "年");
//public void setTime(long time):设置时间,给的是毫秒值
//long time = 1000*60*60;
long time = System.currentTimeMillis();
d.setTime(time);
System.out.println(d);
}
}
4. 代码示例
package text;
import java.util.Date;
import java.util.Random;
/*
需求1:打印时间原点一年后的时间
需求2:随机打印两个任意时间,比较谁的时间在前
*/
public class text84 {
public static void main(String[] args) {
//需求1:打印时间原点一年后的时间
time();
//需求2:随机打印两个任意时间,比较谁的时间在前
compare();
}
//打印时间原点一年后的时间
public static void time() {
//带参构造创建时间对象,获取时间原点的时间
Date d1 = new Date(0l);
//获取时间原点时间的毫秒值
long time = d1.getTime();
//计算一年后的毫秒值
time = time + 1000l * 60 * 60 * 24 * 365;
//带参构造创建时间对象,获取一年后的时间
Date d2 = new Date(time);
System.out.println(d2);
}
//随机打印两个任意时间,比较谁的时间在前
public static void compare() {
//创建随机数,用于表示带参构造中的毫秒数
Random r = new Random();
//利用带参构造创建时间对象
Date d1 = new Date(Math.abs(r.nextInt()));
Date d2 = new Date(Math.abs(r.nextInt()));
//获取时间对象的毫秒值
long time1 = d1.getTime();
long time2 = d2.getTime();
//比较两者毫秒值(时间对象不能进行比较)
if (time1 > time2) {
System.out.println("第一个时间在后面");
} else if (time1 < time2) {
System.out.println("第二个时间在后面");
} else {
System.out.println("两者时间一样!");
}
}
}
SimpleDateFormat类
1. SimpleDateFormat类概述
在Java中,SimpleDateFormat类是一个专门用于处理日期和时间并将其格式化为特定字符串类型的类。该类位于java.text包内,并提供多种方法来设置日期格式、时间格式以及两者的结合格式。此外,它还可以用来解析特定格式的字符串以获取相应的日期和时间信息。
SimplificationFormat类包含多种用于表示时钟信息的时间字符集。这些字符可用于生成表示时钟数据与时间信息的时间模板串。基于生成的时间模板串进行处理时钟数据与时间信息可按指定方式呈现;也可用来转换已知的时间格式文本为具体对象。
java.text.SimpleDateFormat 是一个专门用于格式化日期和时间的技术接口。通过使用该接口我们可以将 Date 对象与 String 对象之间实现相互转换 从而方便地在不同场景下灵活运用这一数据类型的特点。
格式化 :按照指定的格式,把Date对象转换为String对象。
解析 :按照指定的格式,把String对象转换为Date对象。
2. 构造方法
因为DateFormat属于抽象类而无法直接调用因此通常我们会选择其常用的子类java.text.SimpleDateFormat该子类提供了一种标准的方式来定义日期和时间的格式并支持多种日期时间表示形式这是一个非常实用的设计选择
public simpleDateFormat() 默认格式
创建一个遵循指定模式和指定语言环境日期格式符号的SimpleDateFormat对象。该方法基于指定的时间格式模式以及默认的语言环境设置来初始化SimpleDateFormat对象。其中参数pattern为一个字符串类型变量,表示所需的时间格式自定义字符串。
细节 : 创建对象的格式要跟字符串的格式完全一致
3. 格式规则
常用的格式规则为:
| 标识字母(区分大小写) | 含义 |
|---|---|
| y | 年 |
| M | 月 |
| d | 日 |
| H | 时 |
| m | 分 |
| s | 秒 |
备注:更详细的格式规则,可以参考SimpleDateFormat类的API文档。
4. 常用方法
DateFormat类的常用方法有:
public String format(Date date):将Date对象格式化为字符串。
public Date parse(String source):将字符串解析为Date对象。
例如:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormat{
public static void main(String[] args) throws ParseException {
//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);
//3.打印结果
System.out.println(date.getTime());//1463494152515
}
private static void method1() {
//1.利用空参构造创建simpleDateFormat对象,默认格式
SimpleDateFormat sdf1 = new SimpleDateFormat();
Date d1 = new Date(0L);
String str1 = sdf1.format(d1);
System.out.println(str1);//1970/1/1 上午8:00
//2.利用带参构造创建simpleDateFormat对象,指定格式
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
String str2 = sdf2.format(d1);
System.out.println(str2);//1970年01月01日 08:00:00
}
}
5. 综合案例
package text;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/*
构造方法:
public simpleDateFormat() 默认格式
public simpleDateFormat(String pattern) 指定格式
常见方法:
public final string format(Date date) 格式化(日期对象 ->字符串)
public Date parse(string source) 解析(字符串 ->日期对象)
*/
public class text85 {
public static void main(String[] args) throws ParseException {
Format();
Parse();
}
//format()方法 public final string format(Date date) 格式化(日期对象 ->字符串)
public static void Format() {
//利用空参构造创建对象
SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat();
//创建时间对象
Date date1 = new Date(0l);
//调用format()方法
String str1 = simpleDateFormat1.format(date1);
System.out.println(str1); //70-1-1 上午8:00
//利用全参构造创建对象
SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
//调用format()方法
String str2 = simpleDateFormat2.format(date1);
System.out.println(str2); //1970年01月01日 08:00:00
}
//parse()方法 public Date parse(string source) 解析(字符串 ->日期对象)
public static void Parse() throws ParseException {
String str1 = "2023-12-23 23:24:00";
//创建SimpleDateFormat()对象
//注意:创建对象的格式与字符串的格式一样
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//调用parse()方法,将str1转换为时间对象
Date date1 = simpleDateFormat.parse(str1);
//调用parse()方法,将date1转换为字符串
String s1 = simpleDateFormat.format(date1);
System.out.println(s1); //2023-12-23 11:24:00
}
}
Calendar类
1. Calendar类概述
- java.util.Calendar类表示一个“日历类”,可以进行日期运算。
Calendar类属于Java标准库中的一个抽象类别,在java.util包中有明确定位,并负责管理日期和时间的各种细节。例如年份、月份、日期、小时以及分钟和秒钟等方面的信息管理。
Calendar类包含获取、设置以及各个组成部分的方法,并不仅具备计算能力,并且能够执行各种操作。它涵盖多种日历体系,并包括常用的格里高利历(Gregorian Calendar)以及中国的农历(Chinese Calendar)等特殊体系。
为了应对 Date 类在处理日期与时间方面的不足,Calendar 类应运而生;它不仅继承了 Date 类的基本功能,并且在多个方面进行了优化升级;相比 Date 类而言,在复杂场景下的操作效率更高;此外还具备国际化支持与时区管理的能力。
细节 :
Calendar是一个基类模板,无法通过new关键字直接生成实例.相反地,则必须使用getInstance()方法来获取实例或直接生成其子类GregorianCalendar的实例.
根据系统的时区自动获取相应的日历实例,默认基于当前时间设置,并整合所有相关信息到数组中
月份字段的取值范围为0至11。当返回值为0时,则对应的实际月份是1月;建议在获取日期后加1天来转换成实际月份。例如int month = calendar.get(Calendar.MONTH) + 1;
星期:1代表星期日,以此类推,7代表星期六
2. 构造方法
属于抽象类型的Calendar类不具备独立实例化的能力。作为替代方案,在需要时可以调用其父级或相关的其他日期和时间格式库中提供的 GregorianCalendar 类来实现所需功能模块。
- 存在于两种途径用于获取 GregorianCalendar 对象:
- 可以直接构造一个 GregorianCalendar 实例;
- 也可以通过调用 Calendar 类的静态 getInstance() 方法来获得 GregorianCalendar 实例。
3. 常用方法
| 方法名 | 说明 |
|---|---|
| public static Calendar getInstance() | 获取一个它的子类GregorianCalendar对象。 |
public int get(int field)
public void set(int field, int value)
4. get方法示例
public class Demo {
public static void main(String[] args) {
//1.获取一个GregorianCalendar对象
Calendar instance = Calendar.getInstance();//获取子类对象
//2.打印子类对象
System.out.println(instance);
//3.获取属性
int year = instance.get(Calendar.YEAR);
int month = instance.get(Calendar.MONTH) + 1;//Calendar的月份值是0-11
int day = instance.get(Calendar.DAY_OF_MONTH);
int hour = instance.get(Calendar.HOUR);
int minute = instance.get(Calendar.MINUTE);
int second = instance.get(Calendar.SECOND);
int week = instance.get(Calendar.DAY_OF_WEEK);//返回值范围:1--7,分别表示:"星期日","星期一","星期二",...,"星期六"
System.out.println(year + "年" + month + "月" + day + "日" +
hour + ":" + minute + ":" + second);
System.out.println(getWeek(week));
}
//查表法,查询星期几
public static String getWeek(int w) { //w = 1 --- 7
//做一个表(数组)
String[] weekArray = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
// 索引 [0] [1] [2] [3] [4] [5] [6]
return weekArray[w - 1];
}
}
5. set方法示例
public class Demo {
public static void main(String[] args) {
//设置属性——set(int field,int value):
Calendar c1 = Calendar.getInstance();//获取当前日期
//计算出生那天是星期几(假如出生日期为:2000年10月1日)
c1.set(Calendar.YEAR, 2000);
c1.set(Calendar.MONTH, 10 - 1);//转换为Calendar内部的月份值
c1.set(Calendar.DAY_OF_MONTH, 1);
int w = c1.get(Calendar.DAY_OF_WEEK);
System.out.println("班长出生那天是:" + getWeek(w));
}
//查表法,查询星期几
public static String getWeek(int w) { //w = 1 --- 7
//做一个表(数组)
String[] weekArray = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
// 索引 [0] [1] [2] [3] [4] [5] [6]
return weekArray[w - 1];
}
}
6. add方法示例
public class Demo {
public static void main(String[] args) {
//计算200天以后是哪年哪月哪日,星期几?
Calendar c2 = Calendar.getInstance();//获取当前日期
c2.add(Calendar.DAY_OF_MONTH, 200);//日期加200
int y = c2.get(Calendar.YEAR);
int m = c2.get(Calendar.MONTH) + 1;//转换为实际的月份
int d = c2.get(Calendar.DAY_OF_MONTH);
int wk = c2.get(Calendar.DAY_OF_WEEK);
System.out.println("200天后是:" + y + "年" + m + "月" + d + "日" + getWeek(wk));
}
//查表法,查询星期几
public static String getWeek(int w) { //w = 1 --- 7
//做一个表(数组)
String[] weekArray = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
// 索引 [0] [1] [2] [3] [4] [5] [6]
return weekArray[w - 1];
}
}
7. 综合案例
package text;
import java.util.Calendar;
import java.util.Date;
/*
public static Calendar getInstance()获取一个它的子类GregorianCalendar对象。
public int get(int field)获取某个字段的值。
field参数表示获取哪个字段的值,可以使用Calender中定义的常量来表示:
Calendar.YEAR : 年
Calendar.MONTH :月
Calendar.DAY_OF_MONTH:月中的日期
Calendar.HOUR:小时
Calendar.MINUTE:分钟
Calendar.SECOND:秒
Calendar.DAY_OF_WEEK:星期
public void set(int field,int value)设置某个字段的值
public void add(int field,int amount)为某个字段增加/减少指定的值
细节:
1.Calender是一个抽象类,不能直接new,而是需要通过getInstance()方法创建对象或者直接创建其子类GregorianCalendar对象
2.Calender.getInstance()会根据系统的不同时区来获取不同的日历对象,默认表示当前时间,并会把时间中的纪元、年、月、日、时、分、秒、星期等等放到一个数组中
3.月份:范围0~11.如果获取的是0,实际上是1月,一般在获取的时间后面+1,例如 int month = calendar.get(Calendar.MONTH) + 1;
4.星期:1代表星期日,以此类推,7代表星期六
*/
public class text88 {
public static void main(String[] args) {
//创建Calendar日历对象
//注意:Calendar是个抽象类,不能直接创建对象,需要通过getInstance()方法创建对象或者直接创建其子类GregorianCalendar对象
Calendar calendar = Calendar.getInstance();
//获取时间对象
Date date = calendar.getTime();
//给日历设置时间对象
calendar.setTime(date);
System.out.println(calendar);//java.util.GregorianCalendar[time=1705819185676,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=31,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2024,MONTH=0,WEEK_OF_YEAR=4,WEEK_OF_MONTH=4,DAY_OF_MONTH=21,DAY_OF_YEAR=21,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=39,SECOND=45,MILLISECOND=676,ZONE_OFFSET=28800000,DST_OFFSET=0]
//获取时间毫秒值
long time = calendar.getTimeInMillis();
System.out.println(time);//1705819325203
//给日历设置时间毫秒值
calendar.setTimeInMillis(1000);
System.out.println(calendar);//java.util.GregorianCalendar[time=1000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=31,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=1970,MONTH=0,WEEK_OF_YEAR=1,WEEK_OF_MONTH=1,DAY_OF_MONTH=1,DAY_OF_YEAR=1,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=8,HOUR_OF_DAY=8,MINUTE=0,SECOND=1,MILLISECOND=0,ZONE_OFFSET=28800000,DST_OFFSET=0]
//将时间对象改为现在的
calendar.setTime(date);
System.out.println(calendar);//java.util.GregorianCalendar[time=1705819655433,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=31,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2024,MONTH=0,WEEK_OF_YEAR=4,WEEK_OF_MONTH=4,DAY_OF_MONTH=21,DAY_OF_YEAR=21,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=47,SECOND=35,MILLISECOND=433,ZONE_OFFSET=28800000,DST_OFFSET=0]
//获取日历里的某个字段
int year = calendar.get(Calendar.YEAR);
//Calender中的month范围是0~11
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(year + ", " + month + "," + day); //2024, 1,21
//修改日历中的某个字段
calendar.set(Calendar.YEAR, 2030);
calendar.set(Calendar.MONTH, 10);
calendar.set(Calendar.DAY_OF_MONTH, 21);
//获取日历里的某个字段
int year1 = calendar.get(Calendar.YEAR);
//Calender中的month范围是0~11
int month1 = calendar.get(Calendar.MONTH) + 1;
int day1 = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(year1 + ", " + month1 + "," + day1); //2030, 11,21
//为某个字段添加/减少指定的值
calendar.add(Calendar.YEAR, 1);
int year2 = calendar.get(Calendar.YEAR);
System.out.println(year2); //2031
}
}
