在Java开发中,日期和时间的处理随着JDK的迭代发展经历了几个阶段,从最初的java.util.Date和java.util.Calendar到Java 8(java.time包下的类)引入全新的日期时间API。现今在Java中,JDK提供了多种日期和时间相关类,主要包括以下几种:
java.util.Date:这是Java最早提供的日期和时间类表示特定的时间瞬间,精确到毫秒。可以通过System.currentTimeMillis()来获取当前时间的毫秒表示。
java.sql.Date:这是为数据库应用设计的日期类,只包含年、月、日信息,不包含时间和时区信息。
java.sql.Time:类似java.sql.Date,但它只包含小时、分钟和秒信息。
java.sql.Timestamp:这是一个比java.util.Date更加精确的时间戳类,它可以精确到纳秒级别。
java.util.Calendar和java.util.GregorianCalendar:Calendar是一个抽象类,提供了日期和时间的计算方法。GregorianCalendar是Calendar的一个具体实现,用于处理公历(格里高利历)。
java.time包中的类:在Java 8及以上版本,推荐使用java.time包中的类来处理日期和时间,因为它们设计更加合理且功能更加强大。主要类包括LocalDate、LocalTime、LocalDateTime、ZonedDateTime、Instant、Duration、Period等。
现在,让我们来看一下这些日期对象之间的转换:
java.util.Date转换为java.sql.Date
java.util.Date date = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(date.getTime());
java.util.Date转换为java.sql.Time
java.util.Date date = new java.util.Date();
java.sql.Time sqlTime = new java.sql.Time(date.getTime());
java.util.Date转换为java.sql.Timestamp
java.util.Date date = new java.util.Date();
java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(date.getTime());
java.util.Calendar转换为java.util.Date
java.util.Calendar calendar = java.util.Calendar.getInstance();
java.util.Date date = calendar.getTime();
java.util.Date转换为java.util.Calendar
java.util.Date date = new java.util.Date();
java.util.Calendar calendar = java.util.Calendar.getInstance();
calendar.setTime(date);
java.time.LocalDateTime转换为java.util.Date
java.util.Date date = new java.util.Date();
LocalDate localDate = date.toInstant()
.atZone(ZoneId.systemDefault()).toLocalDate();
LocalDateTime localDateTime = date
.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
LocalTime localTime = date
.toInstant().atZone(ZoneId.systemDefault()).toLocalTime();
// 从java.time.LocalDate转换为java.util.Date
Date date1 = Date.from(localDate.atStartOfDay()
.atZone(ZoneId.systemDefault()).toInstant());
Date date2 = Date.from(localDateTime
.atZone(ZoneId.systemDefault()).toInstant());
java.time计算时间差
LocalDateTime beforeLocalDateTime = LocalDateTime.of(2024,4,1,8,5,1);
LocalDateTime afterLocalDateTime = LocalDateTime.of(2024,5,1,8,5,1);
// 时间差—天
long diffDays = ChronoUnit.DAYS.between(beforeLocalDateTime, afterLocalDateTime);
// 时间差-小时
long diffHours = ChronoUnit.HOURS.between(beforeLocalDateTime, afterLocalDateTime);
// 时间差-分钟
long diffMinutes = ChronoUnit.MINUTES.between(beforeLocalDateTime, afterLocalDateTime);
// 时间差-秒钟
long diffSeconds = ChronoUnit.SECONDS.between(beforeLocalDateTime, afterLocalDateTime);
java.util.Date计算时间差
Date beforeDate = new Date();
// 当前时间后一天
Date afterDate = new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24);
// 将Date对象转换为Calendar对象
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(date1);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(date2);
// 计算两个时间相差的天数
int diffDays = calendar2.get(Calendar.DAY_OF_YEAR) -
calendar1.get(Calendar.DAY_OF_YEAR);