Date/Time API Java 8 提供了一个全新的 API,用以替换 java.util.Date 和 java.util.Calendar。Date / Time API 提供了多个类,帮助我们来完成工作,包括:
LocalDate LocalTime LocalDateTime ZonedDateTime
LocalDateTime (Java 8 及以上)
- 位于
java.time包中,是 Java 8 引入的日期时间 API 的一部分。 - 不包含时区信息,仅表示日期和时间,例如
2023-10-06T12:30:00。 - 更现代化,线程安全,推荐在 Java 8+ 的项目中使用。
Date (Java 1.0 开始)
- 位于
java.util包中,是早期 Java 提供的日期时间类。 - 包含日期和时间信息(内部存储为从 1970-01-01 00:00:00 UTC 开始的毫秒数)。
- 不线程安全,API 使用不直观,许多方法已过时。
在 MyBatis 中的使用
2.1 与数据库字段的映射
- 数据库中通常使用
DATETIME、TIMESTAMP或DATE类型来存储时间信息。 - MyBatis 会将这些字段映射到 Java 对象的属性上。
| 数据库字段类型 | LocalDateTime 映射 | Date 映射 |
|---|---|---|
DATETIME | LocalDateTime | Date |
TIMESTAMP | LocalDateTime | Date |
DATE | LocalDate | Date(时间部分为 00:00:00) |
日期格式化
LocalDateTime 格式化
使用 java.time.format.DateTimeFormatter 来格式化和解析 LocalDateTime:
java
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDate = now.format(formatter);
System.out.println(formattedDate); // 输出:2023-10-06 12:30:00Date 格式化
使用 java.text.SimpleDateFormat 来格式化和解析 Date:
java复制代码import java.util.Date;
import java.text.SimpleDateFormat;
Date now = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formattedDate = formatter.format(now);
System.out.println(formattedDate); // 输出:2023-10-06 12:30:005. MyBatis Plus 的支持
如果你使用的是 MyBatis-Plus,它对 LocalDateTime 和 Date 提供了内置支持,无需额外配置。
- 默认支持的类型:
java.time.LocalDateTimejava.time.LocalDatejava.util.Date
java
String dateStr = "2020-01-23T12:23:56";
DateTime dt = DateUtil.parse(dateStr);java
// 解析ISO时间
LocalDateTime localDateTime = LocalDateTimeUtil.parse("2020-01-23T12:23:56");
// 解析自定义格式时间
localDateTime = LocalDateTimeUtil.parse("2020-01-23", DatePattern.NORM_DATE_PATTERN);
// Date对象转换为LocalDateTime
LocalDateTime of = LocalDateTimeUtil.of(dt);
// 时间戳转换为LocalDateTime
LocalDateTime of = LocalDateTimeUtil.ofUTC(dt.getTime());
// "2020-01-23 12:23:56"
String format = LocalDateTimeUtil.format(localDateTime, DatePattern.NORM_DATETIME_PATTERN);
// 增加一天
// "2020-01-24T12:23:56"
LocalDateTime offset = LocalDateTimeUtil.offset(localDateTime, 1, ChronoUnit.DAYS);
// 减少时间
// "2020-01-22T12:23:56"
offset = LocalDateTimeUtil.offset(localDateTime, -1, ChronoUnit.DAYS);
//一天的开始和结束
// "2020-01-23T00:00"
LocalDateTime beginOfDay = LocalDateTimeUtil.beginOfDay(localDateTime);
// "2020-01-23T23:59:59.999999999"
LocalDateTime endOfDay = LocalDateTimeUtil.endOfDay(localDateTime);java
LocalDateTime start = LocalDateTimeUtil.parse("2019-02-02T00:00:00");
LocalDateTime end = LocalDateTimeUtil.parse("2020-02-02T00:00:00");
Duration between = LocalDateTimeUtil.between(start, end);
// 365
between.toDays();System.currentTimeMillis() //返回13位时间戳
Date date = new Date();
Calendar calendar = Calendar.getInstance();