Java 中有关日期时间的操作,其实非常简单,没什么好介绍的。之所以编写简单知识点的博客,主要还是因为最近比较忙碌。但是不管多么忙碌,自己还是想挤出时间,保持编写技术博客的习惯。毕竟编写博客,不仅仅是为了总结,向别人分享技术,更重要的是锻炼自己的思考沉淀能力,以及写作表达能力。下面我就快速简单的介绍一下 Java 中的日期时间操作类吧。
一、传统的日期时间类
传统的日期时间操作类,主要有两个:Date 类和 SimpleDateFormat 类。
Date 类代码示例:
import java.util.Date;
public class DateDemo {
public static void main(String[] args) {
//使用空参构造 Date 对象,打印出的时间就是本机系统当前时间
Date date1 = new Date();
System.out.println(date1);
/*
使用有参构造 Date 对象,参数传递的是从计算机原点时间起的毫秒值
在零时区,计算机原点时间是 1970 年 1 月 1 日 0 点整
因为中国在东八区,所以对于中国而言,计算机原点时间是 1970 年 1 月 1 日 8 点整。
传递 0 毫秒,表示获取计算机原点时间
*/
Date date2 = new Date(0L);
//打印出来的是 Thu Jan 01 08:00:00 CST 1970
//也就是1970年1月1日8点,主要是因为中国是东八区,因此需要加8个小时
System.out.println(date2);
Date date3 = new Date();
//通过 Date 对象的 getTime 可以获取到从计算机原点时间累计到现在的毫秒值
long time1 = date3.getTime();
System.out.println(time1);
//Java也提供了一个快捷方法,获取到从计算机原点时间累计到现在的毫秒值
long time2 = System.currentTimeMillis();
//打印出来的 time2 和 time1 的值是相同的
System.out.println(time2);
Date date4 = new Date();
//通过 setTime 传入从计算机原点起累计的毫秒值,可以设置出新的时间
date4.setTime(0L);
System.out.println(date4); //此时打印出的是计算机原点时间
}
}
SimpleDateFormat 类的代码演示:
import java.text.SimpleDateFormat;
import java.util.Date;
/*
SimpleDateFormat 主要是为了将 Date 对象格式化为自定义的日期时间字符串
也可以将指定格式的日期格式字符串,解析为 Date 对象
*/
public class DateDemo {
public static void main(String[] args) {
//将【日期对象】转换为【字符串】代码示例
Date date1 = new Date();
//创建了一个日期格式。
//SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
String result = sdf1.format(date1);
System.out.println(result);
//将【字符串】转为【日期对象】代码示例
String str = "2012-12-12 12:12:12";
//SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
Date date2 = null;
try {
date2 = sdf2.parse(str);
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(date2);
}
}
Date 类的实例也有很多方法,这里就不演示了,大家可以自己进行学习研究,主要是因为目前 Date 类已经被使用的越来越少了,因为在 JDK8 以后有更好的 LocalDateTime 可以使用,我们重点介绍 LocalDateTime 的使用。
二、JDK8以后新增的日期时间类
类名 | 说明 |
---|---|
LocalDate | 表示日期(年月日) |
LocalTime | 表示时间(时分秒) |
LocalDateTime | 表示时间日期 (年月日时分秒) |
DateTimeFormatter | 将日期时间格式化为字符串或解析日期字符串 |
Period | 表示日期间隔 (间隔的年数,月数,天数,总月数) |
Duration | 表示时间间隔 (间隔的秒数,毫秒数,纳秒数) |
对于 LocalDate 、 LocalTime 、LocalDateTime 这三个类来说,最常用的还是 LocalDateTime ,下面我们就以 LocalDateTime 为例进行代码演示:
import java.time.LocalDateTime;
public class LocalDateTimeDemo {
public static void main(String[] args) {
//实例化 LocalDateTime 对象
LocalDateTime now = LocalDateTime.now();
System.out.println(now); //打印系统本机当前时间
//采用 of 的重载方法,按照指定的年月日时分秒实例化 LocalDateTime
LocalDateTime localDateTime = LocalDateTime.of(2022, 12, 12, 11, 11, 11);
System.out.println(localDateTime);
}
}
LocalDateTime 常用方法为下表,由于见名知意,非常简单,这里就不再演示了。
方法名 | 说明 |
---|---|
public int getYear() | 获取年 |
public int getMonthValue() | 获取月份(1-12) |
public int getDayOfMonth() | 获取月份中的第几天(1-31) |
public int getDayOfYear() | 获取一年中的第几天(1-366) |
public DayOfWeek getDayOfWeek() | 获取星期 |
public int getMinute() | 获取分钟(0 - 59) |
public int getHour() | 获取小时(0 - 23) |
public int getSecond() | 获取秒(0 - 59) |
LocalDateTime 通过 DateTimeFormatter 与日期时间格式的字符串之间的转换代码演示如下:
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class LocalDateTimeDemo {
public static void main(String[] args) {
//将字符串转为为 LocalDateTime
String str1 = "2022-11-11 12:13:15";
DateTimeFormatter pattern1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime parse = LocalDateTime.parse(str1, pattern1);
System.out.println(parse);
//将 LocalDateTime 转为为字符串
LocalDateTime localDateTime = LocalDateTime.of(2022, 12, 12, 23, 59, 59);
System.out.println(localDateTime);
DateTimeFormatter pattern2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒");
String str2 = localDateTime.format(pattern2);
System.out.println(str2);
}
}
LocalDateTime 进行日期加减的方法,对于以 plus 为开头的方法来说,传入正数为添加,传入负数为减去。
方法名 | 说明 |
---|---|
public LocalDateTime plusYears (long years) | 添加或者减去年 |
public LocalDateTime plusMonths(long months) | 添加或者减去月 |
public LocalDateTime plusDays(long days) | 添加或者减去日 |
public LocalDateTime plusHours(long hours) | 添加或者减去时 |
public LocalDateTime plusMinutes(long minutes) | 添加或者减去分 |
public LocalDateTime plusSeconds(long seconds) | 添加或者减去秒 |
public LocalDateTime plusWeeks(long weeks) | 添加或者减去周 |
LocalDateTime 修改对应的日期时间的方法如下表,也是见名知意,非常简单,这里就不演示了。
方法名 | 说明 |
---|---|
public LocalDateTime withYear(int year) | 直接修改年 |
public LocalDateTime withMonth(int month) | 直接修改月 |
public LocalDateTime withDayOfMonth(int dayofmonth) | 直接修改日期(一个月中的第几天) |
public LocalDateTime withDayOfYear(int dayOfYear) | 直接修改日期(一年中的第几天) |
public LocalDateTime withHour(int hour) | 直接修改小时 |
public LocalDateTime withMinute(int minute) | 直接修改分钟 |
public LocalDateTime withSecond(int second) | 直接修改秒 |
Period 类主要用于计算两个 LocalDate 的间隔,主要方法如下:
方法名 | 说明 |
---|---|
public static Period between(开始时间,结束时间) | 计算两个日期的间隔 |
public int getYears() | 获得这段时间的年数 |
public int getMonths() | 获得此期间的总月数 |
public int getDays() | 获得此期间的天数 |
public long toTotalMonths() | 获取此期间的总月数 |
演示代码如下:
import java.time.LocalDate;
import java.time.Period;
public class PeriodDemo {
public static void main(String[] args) {
//计算两个日期之间的间隔,需要使用 LocalDate 对象
LocalDate localDate1 = LocalDate.of(2022, 1, 1);
LocalDate localDate2 = LocalDate.of(2050, 12, 12);
Period period = Period.between(localDate1, localDate2);
System.out.println(period);//P28Y11M11D
//获得间隔的年数
System.out.println(period.getYears());//28
//获得间隔的月数
System.out.println(period.getMonths());//11
//获得间隔的天数
System.out.println(period.getDays());//11
//获取间隔的总月数
System.out.println(period.toTotalMonths());//347
/*
从以上打印出来的结果可以发现,以 get 开头的方法,获取间隔的年数,月数,天数,并不是总数。
其实就是对应年之间,对应月之间,对应天之间的相减,这一点需要特别注意
以 to 开头的方法,获取的才是间隔的总数,但是 period 只有 toTotalMonths 这一个方法,
要是有 toTotalDays 和 toTotalYears 方法就更好了。
*/
}
}
Duration 类主要用于计算两个 LocalDate 或 LocalDateTime 之间的间隔,主要方法如下:
方法名 | 说明 |
---|---|
public static Durationbetween(开始时间,结束时间) | 计算两个日期时间的间隔 |
public long toDays() | 获得此时间间隔的总天数 |
public long toHours() | 获得此时间间隔的总小时数 |
public long toMinutes() | 获得此时间间隔的总分钟数 |
public long toSeconds() | 获得此时间间隔的总秒数 |
public long toMillis() | 获得此时间间隔的总毫秒数 |
public long toNanos() | 获得此时间间隔的总纳秒数 |
演示代码如下:
import java.time.Duration;
import java.time.LocalDateTime;
public class DurationDemo {
public static void main(String[] args) {
LocalDateTime localDateTime1 = LocalDateTime.of(2021, 1, 1, 12, 12, 12);
LocalDateTime localDateTime2 = LocalDateTime.of(2022, 2, 1, 12, 12, 12);
Duration duration = Duration.between(localDateTime1, localDateTime2);
System.out.println(duration);//PT9504H
//获得间隔的总天数
System.out.println(duration.toDays());
//获得间隔的总小时数
System.out.println(duration.toHours());
//获得间隔的总分钟数
System.out.println(duration.toMinutes());
//获得间隔的总秒数
System.out.println(duration.toSeconds());//34214400
//获得间隔的总毫秒数
System.out.println(duration.toMillis());//34214400000
//获得间隔的总纳秒数
System.out.println(duration.toNanos());//34214400000000000
/*
从上面的输出结果可以发现,以 to 开头的方法,获取的都是对应的间隔总数
这些方法的实现结果,是我们经常需要用到的
*/
}
}
到此为止,Java 有关日期时间的操作,已经基本介绍完了。总体来说非常简单,我在这里列出的都是比较常用的方法,至于其它方法的使用,需要用到的时候,查一下 Jdk 文档或者上网查找一下相关资料即可,总之都是非常简单。