1 时间和日期
1.1 概述
- 时间是指具体的时分秒,不同时区的时间不同;
- 日期是指具体的某一天;
- 日期+时间可以具体到某一个时间节点。
1.2 时间戳
时间戳时 unix 时间,从 1970 年 1 月 1 日 0 时开始计算的毫秒数,实际就是从 1970 年 1 月 1 日 0 时到目时间的时间差值的毫秒级显示。
在 java 中一般用 long 存储时间戳,可以使用 System.currentTimeMillis() 来获取时间戳。
2 Date 日期时间类
摘要
java提供的获取日期和时间的工具类
2.1 常用方法
2.1.1 构造方法
| 方法 | 描述 |
|---|---|
| new Date() | 以当前时间创建一个 Date 对象 |
| new Date (long date) | 创建一个以时间戳时间作为创建时间的 Date 对象 |
/**
* 构造方法
*/
Date date = new Date();
System.out.println(date);
Date date1 = new Date(currentTimeMillis);
System.out.println(date1);2.1.2 常用方法
| 方法 | 描述 |
|---|---|
| boolean after(Date when); | 与 Date 类比较,如果在指定日期之后返回 true ,否则返回 false; |
| boolean before(Date when); | 比较该日期是否早于指定日期,若早返回 true,否则返回 false |
| int compareTo(Date anotherDate); | 比较该日期与指定日期,相等则为 0,早于则大于 0,否则小于 0 |
| boolean equals(Object obj) | 若调用该方法的Date对象,和指定日期相等时则返回true,否则返回false。 |
| long getTime(); | 获取时间戳 |
| void setTime(long time); | 设置时间戳 |
| String toString(); | 转换为日期格式字符串:dow mon dd hh:mm:ss zzz yyyy其中 dow 是一周中的星期几; zzz 是时区(可能反映夏令时)。标准时区缩写包括解析法识别的缩写。 |
/**
* 常用方法
*/
boolean after = date.after(date1);
System.out.println(after);
boolean before = date.before(date1);
System.out.println(before);
int i = date.compareTo(date1);
System.out.println(i);
boolean equals = date.equals(date1);
System.out.println(equals);
long time = date.getTime();
System.out.println(time);
date.setTime(currentTimeMillis);
System.out.println(date);
String string = date.toString();
System.out.println(string);直接使用时间日期类所获取的时间和日期格式不复核我们常用的日期格式标准,后续需要对时间日期格式进行转换,可使用 SimpleDateFormat 进行处理。
2.1.3 其他方法
| 方法 | 描述 |
|---|---|
| int getYear(); | 获取年份,获取后必须加 1900 才能获取当前年份; |
| int getMonth(); | 获取月份,区间为 0-11,获取后必须加 1 才能获取当前月份; |
| int getDate(); | 获取天,区间为 0-31,不需要加 1。 |
| int getHours(); | 区间为 0-23; |
| int getMinutes(); | 0-59; |
| int getSeconds(); | 0-59 |
2.2 应用:统计耗时
long startTime = System.currentTimeMillis();
for (int j = 0; j < 100000; j++) {
System.out.println(j);
}
long endTime = System.currentTimeMillis();
System.out.println("耗时:"+(endTime-startTime));3 Calendar 日期类
定义
Calender是一个抽象类,是JAVA对Date类的拓展,提供了更简单的时间比较和计算。因为是抽象类,所以不能使用new初始化,通常使用getInstance方法初始化对象。其常用的子类有GregorianCalendar提供标准日历系统,用于计算过去或未来的某天日期。TimeZone可以用来在不同时区对日期和时间进行转换。
3.1 构建 Calendar 对象
Calendar instance = Calendar.getInstance();//默认当前时间
System.out.println(instance);
//创建一个时间
Calendar instance1 = Calendar.getInstance();
instance1.set(2025,7,21,10,05,59);
System.out.println(instance1);3.2 常量字段
| 常量 | 描述 |
|---|---|
| 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 | 星期几 |
Calendar instance = Calendar.getInstance();
int year = instance.get(Calendar.YEAR);
System.out.println(year);
int month = instance.get(Calendar.MONTH);
System.out.println(month);3.3 常用方法
| 方法 | 描述 |
|---|---|
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 的当前时间值 |
3.4 获取当前时间
//获取当前时间
int year = instance.get(Calendar.YEAR);
System.out.println(year);
int month = instance.get(Calendar.MONTH);
System.out.println(month);
//设置时间
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(Calendar.YEAR,2022);
calendar.set(Calendar.MONTH,1);
System.out.println(calendar.getTime());4 时间格式化
SimpleDateFormat 提供了日期和时间的转换,可将 Date 转换为字符串格式。
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = simpleDateFormat.format(new Date());
System.out.println(format);//2025-12-03 11:46:204.1 自定义格式字母
| 字母 | 含义 | 示例 |
|---|---|---|
| y | 年份。一般用 yy 表示两位年份,yyyy 表示 4 位年份 | 使用 yy 表示的年份,如 11;使用 yyyy 表示的年份,如 2011 |
| M | 月份。一般用 MM 表示月份,如果使用 MMM,则会根据语言环境显示不同语言的月份 | 使用 MM 表示的月份,如 05;使用 MMM 表示月份,在 Locale.CHINA 语言环境下,如“十月”;在 Locale.US 语言环境下,如 Oct |
| d | 月份中的天数。一般用 dd 表示天数 | 使用 dd 表示的天数,如 10 |
| D | 年份中的天数。表示当天是当年的第几天,用 D 表示 | 使用 D 表示的年份中的天数,如 295 |
| E | 星期几。用 E 表示,会根据语言环境的不同显示不同语言的星期几 | 使用 E 表示星期几,在 Locale.CHINA 语言环境下,如“星期四”;在 Locale.US 语言环境下,如 Thu |
| H | 一天中的小时数(0~23)。一般用 HH 表示小时数 | 使用 HH 表示的小时数,如 18 |
| h | 一天中的小时数(1~12)。一般使用 hh 表示小时数 | 使用 hh 表示的小时数,如 10(注意 10 有可能是 10 点,也可能是 22 点) |
| m | 分钟数。一般使用 mm 表示分钟数 | 使用 mm 表示的分钟数,如 29 |
| s | 秒数。一般使用 ss 表示秒数 | 使用 ss 表示的秒数,如 38 |
| S | 毫秒数。一般使用 SSS 表示毫秒数 | 使用 SSS 表示的毫秒数,如 156 |
5 JDK 8 日期/时间新特性
新API基于ISO标准⽇历系统,java.time包下的所有类都是不可变类型⽽且线程安全。
| 编号 | 类的名称 | 描述 |
|---|---|---|
| 1 | Instant | 时间戳 |
| 2 | Duration | 持续时间,时间差 |
| 3 | LocalDate | 只包含日期,比如:2018-02-05 |
| 4 | LocalTime | 只包含时间,比如:23:12:10 |
| 5 | LocalDateTime | 包含日期和时间,比如:2018-02-05 23:14:21 |
| 6 | Period | 时间段 |
| 7 | ZoneOffset | 时区偏移量,比如:+8:00 |
| 8 | ZonedDateTime | 带时区的时间 |
| 9 | Clock | 时钟,比如获取目前美国纽约的时间 |
| 10 | java.time.format.DateTimeFormatter | 时间格式化 |