MySQL Date和DateTime

Date

  • 存储: 仅存储日期值,格式为 YYYY-MM-DD
  • 范围: 从 1000-01-019999-12-31
  • 用途: 当你只需要年月日信息时使用。

DateTime

  • 存储: 存储日期和时间值,格式为 YYYY-MM-DD HH:MM:SS
  • 范围: 在MySQL中,例如,从 1000-01-01 00:00:009999-12-31 23:59:59
  • 用途: 当你需要存储时间点信息时使用,包括年月日以及时分秒。

TIMESTAMP和DateTime

TIMESTAMP:也用来存储日期和时间,格式与DATETIME相同,但是它具有时间戳的特性,能够自动记录数据的修改和插入时间。TIMESTAMP的值是以UTC时间为基础的,当你插入或者读取数据时,它会自动转换为当前时区的时间。TIMESTAMP的表示范围通常比DATETIME小,从1970-01-01 00:00:01 UTC到2038-01-19 03:14:07 UTC。

Java类 LocalDate 和 LocalDateTime 的对应

LocalDate

  • 对应: 对应数据库中的 Date 类型。
  • 存储: 仅存储日期信息,没有时间或时区。
  • 用途: 当你在Java程序中只需要年月日信息时使用。

LocalDateTime

  • 对应: 对应数据库中的 DateTime 类型。
  • 存储: 存储日期和时间信息,没有时区信息。
  • 用途: 当你在Java程序中需要年月日以及时分秒信息时使用,但不考虑时区。

与数据库交互

JDBC 4.2 及以上版本

JDBC 4.2 及以上版本不需要额外处理数据转换

JDBC 4.2 及以下版本

JDBC 4.2 以下版本需要额外处理,通常需要将 LocalDateLocalDateTime 转换为数据库理解的格式,或者反之。以下是如何进行这些转换的示例。

将 LocalDate 和 LocalDateTime 转换为数据库格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.sql.Date;
import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.LocalDateTime;

public class DateConversionExample {
public static void main(String[] args) {
// 将 LocalDate 转换为 sql.Date
LocalDate localDate = LocalDate.now();
Date date = Date.valueOf(localDate);

// 将 LocalDateTime 转换为 sql.Timestamp
LocalDateTime localDateTime = LocalDateTime.now();
Timestamp timestamp = Timestamp.valueOf(localDateTime);
}
}

从数据库格式转换为 LocalDate 和 LocalDateTime

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.sql.Date;
import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.LocalDateTime;

public class DateConversionExample {
public static void main(String[] args) {
// 从 sql.Date 转换为 LocalDate
Date date = new Date(System.currentTimeMillis());
LocalDate localDate = date.toLocalDate();

// 从 sql.Timestamp 转换为 LocalDateTime
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
LocalDateTime localDateTime = timestamp.toLocalDateTime();
}
}

注意事项:

  • 当将 LocalDateLocalDateTime 存储到数据库时,确保数据库连接的时区设置与Java应用程序的时区相匹配,特别是对于 LocalDateTime,因为它不包含时区信息。
  • 如果你的应用程序在世界各地使用,考虑使用 ZonedDateTimeOffsetDateTime 以处理时区问题。
  • 从Java 8开始,建议使用 java.time 包中的日期和时间类,因为它们修复了旧 java.util.Date 类的许多设计问题,并且是不可变的,这有助于创建更健壮、线程安全的应用程序。