Java中LocalDateTime类
Java中的日期类
- Date类
- LocalDateTime类
- 创建LocalDateTime对象
- 1 获取当前时间
- 2 获取自己指定时间
- 3 字符串创建日期
- 获取当前日期的信息
- 1获取当前日期的年月日 时分秒
- 2 获取当前日期周几\当年第几天\当月第几天
- 3 获取当前⽇期所在周的周⽇和周⼀
- 日期的运算
- 1日期加减天数
- 2 日期加减周数
- 3日期加减月份
- 4日期加减年份
- 日期之间的比较
- 1两日期是否相同
- 1一个日期在指定日期之前还是之后
前言
在编程的世界中,处理日期和时间是一个不可避免的需求。无论是记录事件发生的时间、计算时间间隔,还是进行日历相关的操作,日期和时间的处理都是开发过程中不可或缺的一部分。而提到Java中的日期处理,Date类是一个绕不开的话题,但是其有一些局限性,因此Java创建了另一个LocalDateTime类
Date类
Date类是Java早期版本中⽤于表⽰⽇期和时间的类,表示时间精确到毫秒
Date()
Date(int year,int month,int date)
Date(int year,int month,int date,int hrs,int min)
Date(int year,int month,int date,int hrs,int min,int sec)
Date(String s)
上面是Date类的五种构造方法
public class Test {
public static void main(String[] args) {
Date date = new Date();
Date date1 = new Date(125,3,2);
Date date2 = new Date(125,3,2,1,2);
Date date3 = new Date(2025,3,2,1,1,1);
System.out.println("无参的构造 "+date);
System.out.println("3个参数的构造 "+date1);
System.out.println("5个参数的构造 "+date2);
System.out.println("6个参数的构造 "+date3);
}
}
日期的计算方法
Date(int year,int month,int date)
Date date1 = new Date(125,4,5);
1.这里的Date类时间是从1900年开始计算,也就是这里输出的结果是year+1900,也就是这里的2025
2.month月分也不是本身,这里的0表示1月,1表示2月,以此类推,month+1才是打印的月份,这里4表示就是5月
3.这里的天数不变就是date
4.输出结果中的CST表示的是时区
4.这里如果是无参的就获取当前时间包括时间
5.带参数的如果没有传入时间,这里会默认为0
运行结果如下
在编写的时候,这个关键字就出现了一条横杠,这里表示的是这个类的这个方法已经过时了,但是还是可以使用,因为这个方法使用的不方便,Java创造了一个新的类LocalDateTime类来处理时间
LocalDateTime类
static LocalDateTime now() | 获取默认当前时间 |
getYear | 获取年份 |
getMonth | 使用月份枚举类获取月份 |
getDayOfMonth | 获取日期在该月是第几天 |
getDayOfWeek | 获取日期是星期几 |
getDayOfYear | 获取日期在该年是第几天 |
getHour | 获取小时 |
getMinute | 获取分钟 |
getSecond | 获取秒 |
plusYears | 增加年 |
plusMonths | 增加月 |
plusWeeks | 增加周 |
plusDays | 增加天 |
plusHours | 增加小时 |
plusMinutes | 增加分 |
plusSeconds | 增加秒 |
minusYears | 减少年 |
minusMonths | 减少月 |
meminusWeeks | 减少周 |
minusDays | 减少天 |
minusHours | 减少小时 |
minusMinutes | 减少分 |
minusSeconds | 减少秒 |
isEqual | 判断日期时间是否相等 |
创建LocalDateTime对象
下面是其部分源码
可以发现这里的LocalDateTime是被final修饰的是不可以new新对象的,其内部的方法是被static修饰的可以直接使用类名进行访问
1 获取当前时间
static LocalDateTime now()
获取当前时间
public class Test {
public static void main(String[] args) {
LocalDateTime nowTime = LocalDateTime.now();
System.out.println("当前时间为:"+nowTime);
}
}
运行结果如下
这里的时间是精确到毫秒的
2 获取自己指定时间
static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second,intnanoOfSecond)
获取自己创建的时间
public class Test {
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.of(2025,3,1,9,30);
LocalDateTime localDateTime1 = LocalDateTime.of(2025,4,5,9,31,1,1);
System.out.println(localDateTime1);
System.out.println(localDateTime);
}
}
这里的结果和Date不同,没写时分秒它就不会显示,只会显示你写的
这里是一直可以显示到毫秒,但是在创建对象的时候最少要创建到分钟,因为其方法最少就是5个参数
3 字符串创建日期
public class Test {
public static void main(String[] args) {
String stringDate = "2025-03-21 09:30:21";
//创建⼀个⽇期时间格式化器
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime date = LocalDateTime .parse(stringDate,dateTimeFormatter);
System.out.println("当前⽇期为: "+date);
}
}
运行结果如下
这里将这个字符串日期进行打印成日期的格式
获取当前日期的信息
1获取当前日期的年月日 时分秒
int getYear()//获取年
nt getMonthValue()//获取月
int getDayOfMonth()//获取当前月的第几天
int getHour()//获取小时
int getMinute()//获取分钟
int getSecond()//获取秒
返回值都是int
public class Test {
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.of(2025,3,2,9,30,1);
int year = localDateTime.getYear();
int month = localDateTime.getMonthValue();
int day = localDateTime.getDayOfMonth();
int hour = localDateTime.getHour();
int minute = localDateTime.getMinute();
int second = localDateTime.getSecond();
System.out.println("年:"+year);
System.out.println("月:"+month);
System.out.println("日:"+day);
System.out.println("时:"+hour);
System.out.println("分:"+minute);
System.out.println("秒:"+second);
}
}
运行结果如下
这里的确获取成功了
2 获取当前日期周几\当年第几天\当月第几天
int getDayOfYear()//获取日期是当年的多少天
int getDayOfMonth()//获取日期是当月的多少天
DayOfWeek getDayOfWeek()//获取日期是本周的周几
public class Test {
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.now();//获取当前时间
System.out.println("当前时间为:"+localDateTime);
DayOfWeek dayOfWeek = localDateTime.getDayOfWeek();//获取周几
int dayofyear = localDateTime.getDayOfYear();
int dayofmonth = localDateTime.getDayOfMonth();
System.out.println("日期是当年的第几天 "+dayofyear);
System.out.println("日期是当月的第几天 "+dayofmonth);
System.out.println("当天周几 "+dayOfWeek);
}
}
运行结果如下
这里相差4天,说明今天是本月的第5天,相差94天,说明今天是本年的第95天
3 获取当前⽇期所在周的周⽇和周⼀
public class Test {
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("当前时间"+localDateTime+" "+localDateTime.getDayOfWeek());
//向前或后找周一
LocalDateTime firstDayofweek = localDateTime.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
LocalDateTime firstDayofweek1 = localDateTime.with(TemporalAdjusters.nextOrSame(DayOfWeek.MONDAY));
//向前或后找周日
LocalDateTime lastDayofWeek = localDateTime.with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY));
LocalDateTime lastDayofWeek1 = localDateTime.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
System.out.println("向前面找周一 "+firstDayofweek);
System.out.println("向后面找周一 "+firstDayofweek1);
System.out.println("向前面面找周日 "+lastDayofWeek);
System.out.println("向后面面找周日 "+lastDayofWeek1);
}
}
LocalDateTime with(TemporalAdjuster adjuster) 返回此日期时间的调整副本
previousOrSame 在当前日期或者之前找最近的自己所指定的周几
nextOrSame 在当前日期或者之后找最近的自己所指定的周几
自己根据自己的需求来进行查找
e.png)
如果自己想要获取当前周的周一和周日的话,就要根据今天周几来选择从前或者从后
public class Test {
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("当前时间"+localDateTime+" "+localDateTime.getDayOfWeek());
//向前或后找周一
LocalDateTime firstDayofweek = localDateTime.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
LocalDateTime lastDayofWeek1 = localDateTime.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
System.out.println("向前面找周一 "+firstDayofweek);
System.out.println("向后面面找周日 "+lastDayofWeek1);
}
}
这里的日期是周六,因此自己向前找周一,向后找周日,这样才是本周的
运行结果如下
日期的运算
1日期加减天数
LocalDateTime plusDays(long days) //往后days天
LocalDateTime minusDays(long days) //往前days天
public class Test {
public static void main(String[] args) {
LocalDateTime nowdate = LocalDateTime.now();
LocalDateTime newdateplus = nowdate.plusDays(1);
LocalDateTime newdateminus = nowdate.minusDays(1);
System.out.println("当前时间:"+nowdate);
System.out.println("向前一天的日期:"+ newdateminus);
System.out.println("向后一天的日期:"+newdateplus);
}
}
2 日期加减周数
LocalDateTime plusWeeks(long weeks)//往后weeks周
LocalDateTime minusWeeks(long weeks)//往前weeks周
public class Test {
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.now();
LocalDateTime newdateplus = localDateTime.plusWeeks(1);
LocalDateTime newdateminus = localDateTime.minusWeeks(1);
System.out.println("当前时间:"+localDateTime);
System.out.println("往前一周"+newdateminus);
System.out.println("往后一周"+newdateplus);
}
}
3日期加减月份
LocalDateTime plusMonths(long nanos)
LocalDateTime minusMonths(long months)
public class Test {
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.now();
LocalDateTime newdateplus = localDateTime.plusMonths(1);
LocalDateTime newdateminus = localDateTime.minusMonths(1);
System.out.println("当前时间:"+localDateTime);
System.out.println("往前一月"+newdateminus);
System.out.println("往后一月"+newdateplus);
System.out.println("================================");
//这里如果3月最后一天,往前月日期是多少呢
LocalDateTime localDateTime1 = LocalDateTime.of(2024,3,31,1,1);
LocalDateTime newdateplus1 = localDateTime1.plusMonths(1);
LocalDateTime newdateminus1 = localDateTime1.minusMonths(1);
System.out.println("当前时间:"+localDateTime1);
System.out.println("往前一月"+newdateminus1);
System.out.println("往后一月"+newdateplus1);
}
}
运行结果如下
这里编译器不是简单的加减一个月,它也会做处理的,就像这里的2024-3-31向前一个月,这里的二月并没有31天,因此编译器会向前到2月的最后一天,并不是31天
4日期加减年份
LocalDateTime plusYears(long years) //往后years年
LocalDateTime minusYears(long years) //往前years年
public class Test {
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.of(2024,2,29,1,1);
LocalDateTime newdateplus = localDateTime.plusYears(1);
LocalDateTime newdateminus = localDateTime.minusYears(1);
System.out.println("当前时间:"+localDateTime);
System.out.println("往前一年"+newdateminus);
System.out.println("往后一年"+newdateplus);
}
}
运行结果如下
从这个结果中可以看出,编译器并不是简单的年份相加减,就像这里的2024年是闰年2月有29天,让其2月最后一天进行向前或向后一年,这里的2023和2025都不是闰年,所以这里往前往后2月只有28天,因此,这里向前或向后编译器会进行判断和处理
日期之间的比较
1两日期是否相同
boolean isEqual(ChronoLocalDateTime<?> other)
判断两个日期是否相同
public class Test {
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.of(2024,2,2,1,1);
LocalDateTime localDateTime1 = LocalDateTime.of(2024,2,2,1,1);
LocalDateTime localDateTime2 = LocalDateTime.of(2025,2,2,1,1);
//判断两个日期是否相同
boolean bool = localDateTime.isEqual(localDateTime1);//相同
boolean bool1 = localDateTime.isEqual(localDateTime2);//不相同
System.out.println(bool);
System.out.println(bool1);
}
}
1一个日期在指定日期之前还是之后
boolean isAfter(ChronoLocalDateTime<?> other) 检查此日期时间是否在指定的日期时间之后
boolean isBefore(ChronoLocalDateTime<?> other)检查此日期时间是否在指定的日期时间之前
public class Test {
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.of(2024,2,2,1,1);
LocalDateTime localDateTime1 = LocalDateTime.of(2025,2,2,1,1);
//判断两个日期是否相同
boolean bool = localDateTime.isBefore(localDateTime1);//前一个是否在后一个之前
boolean bool1 = localDateTime.isAfter(localDateTime1);//前一个是否在后一个之后
System.out.println(bool);
System.out.println(bool1);
}
}
第一个日期在第二个之前
所以这里的bool返回true,bool1返回false