小伙伴们大家好,系统中不少模块都要用到时间日期,来分析总结下项目中用到的些日期类
目录
一、时间日期类
1.java.util.Calendar:
2.java.util.Date:
3.java.time.LocalDate、java.time.LocalTime、java.time.LocalDateTime:
二、代码样例
2.1 LocalDate测试
2.2 Instant测试
三、实战使用案例
编辑
章末
一、时间日期类
1.java.util.Calendar
:
Calendar
类提供了一个抽象的日历类,可以进行日期和时间的计算、格式化等操作。与Date
类相比,Calendar
类提供了更多的功能,并且可以处理时区等问题。但是,Calendar
类在设计上存在一些缺陷,使用起来较为繁琐,例如:
Calendar
类的API设计比较复杂,容易出错。Calendar
类的实现不是线程安全的,需要进行额外的同步处理。Calendar
类的性能比较低,因为它需要进行大量的计算。
2.java.util.Date
:
Date
类是Java最早引入的日期时间类,用于表示特定的时间点。它的内部实现是一个长整型数值,表示自1970年1月1日00:00:00 GMT以来经过的毫秒数。由于其内部实现的限制,Date
类存在一些问题,例如:
Date
类中的很多方法已经被废弃,不建议使用。Date
类不提供时区支持,因此在涉及跨时区的应用中会出现问题。Date
类的精度只能到毫秒级别,无法表示更精确的时间戳。
3.java.time.LocalDate
、java.time.LocalTime
、java.time.LocalDateTime
:
LocalDate
、LocalTime
和LocalDateTime
是Java 8引入的新的日期时间类。它们分别用于表示日期、时间和日期时间。这些类提供了丰富的方法来进行日期时间的操作和计算,并且处理时区等问题更加方便。与Calendar
类相比,java.time
包下的日期时间类具有以下优点:
- 设计简洁,API清晰易懂,使用起来更加方便。
- 所有的日期时间类都是不可变的,线程安全,可以避免并发问题。
- 支持时区、夏令时等功能,可以处理跨时区的应用场景。
- 性能较高,比
Calendar
类更为快速。
二、代码样例
2.1 LocalDate测试
public class TimeTest {
public static void main(String[] args) {
//获取当前日期
LocalDate localDate = LocalDate.now();
//2023-12-21
//获取日期的年月日
int year = localDate.getYear();
//2023
Month month = localDate.getMonth();
//DECEMBER
int dayOfMonth = localDate.getDayOfMonth();
//21
//创建指定日期
LocalDate specialDate = LocalDate.of(2024, 12, 21);
//2024-12-21
LocalDateTime specialDateTime = LocalDateTime.of(2023, 12, 21,16,12,30);
//2023-12-21T16:12:30
//日期格式化输出
String formatDate = specialDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
//2023-12-21
//日期运算,加七天
LocalDate localDatePlus = specialDate.plusDays(7);
//2023-12-28
//判断日期先后
boolean isBefore = localDatePlus.isBefore(localDate);
//false
//日期间隔
long daysBetween = ChronoUnit.DAYS.between(localDate, localDatePlus);
//7
}
}
2.2 Instant测试
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
public class InstantTimeTest {
public static void main(String[] args) {
//获取当前时间戳
Instant now = Instant.now();
//2023-12-21T08:24:31.903Z
//创建指定时间戳
Instant milli = Instant.ofEpochMilli(1639999999000L);
//2021-12-20T11:33:19Z
//时间戳格式化输出
String s = milli.toString();
//2021-12-20T11:33:19Z
//时间戳与日期时间的转换
LocalDateTime localDateTime = LocalDateTime.ofInstant(milli, ZoneId.systemDefault());
//2021-12-20T19:33:19
Instant instant = localDateTime.toInstant(ZoneOffset.UTC);
//2021-12-20T19:33:19Z
}
}
三、实战使用案例
需要计算现在到24年双11之间相隔的天数,并且需要排除周六和周日这两天。
首先,我们可以使用
LocalDate
类来表示起始日期和结束日期,然后使用循环遍历这两个日期之间的每一天,判断该天是否是周六或周日,如果不是,则将天数加1。
public class SumDays {
public static void main(String[] args) {
LocalDate now = LocalDate.of(2023, 12, 21);
LocalDate end = LocalDate.of(2024, 11, 11);
int days = 0;
LocalDate localDate = now;
while(localDate.isBefore(end) || localDate.isEqual(end)){
if(localDate.getDayOfWeek() != DayOfWeek.SATURDAY && localDate.getDayOfWeek() != DayOfWeek.SUNDAY){
days ++;
}
localDate = localDate.plusDays(1);
}
System.out.println("现在的日期是:"+now+ " 到2024年双11相隔天数(不包括周六周日):"+days);
}
}
章末
文章到这里就结束了