首页 > Java > java教程 > Java 的 java.time API 和 MySQL 的 DATE 类型如何处理没有时间或时区信息的日期?

Java 的 java.time API 和 MySQL 的 DATE 类型如何处理没有时间或时区信息的日期?

Barbara Streisand
发布: 2024-12-29 14:33:11
原创
421 人浏览过

How Can Java's `java.time` API and MySQL's `DATE` Type Handle Dates Without Time or Timezone Information?

Java/MySQL 中没有时间或时区的日期

简介

存储仅代表年、月、日期(例如生日)在处理时区时提出了挑战。本文探讨了使用现代 Java API 解决此问题的优雅解决方案。

挑战

传统的 Java 日期时间表示(例如 java.util.Date)包括时间和时区组件。存储没有特定时间或时区的抽象日期会引起对不同时区的不同环境之间保持一致性的担忧。

解决方案:java.time

Java SE 8引入了 java.time API,它提供了一种强大而有效的方法来处理日期时间计算。 LocalDate 是这个 API 中的一个关键类,代表一个没有任何时间或时区信息的日期。

例如:

LocalDate birthday = LocalDate.of(1990, 1, 1);
登录后复制

这个代码代表 1990 年 1 月 1 日的生日,无论什么时候机器的时区。

映射到MySQL

LocalDate 映射到 ANSI SQL 类型 DATE,如下所示:

ALTER TABLE persons ADD COLUMN birthday DATE;
登录后复制

数据库注意事项

  • MySQL 数据库内部以 UTC 格式存储 DATE 值,但在以下情况下它们会以客户端的时区显示:
  • JDBC 驱动程序在数据库交互期间处理 UTC 和本地时区之间必要的转换。

好处

  • 确保不同时区的一致日期表示。
  • 消除了复杂的需要时区计算或字符串操作。
  • 简化数据库模式设计和数据检索操作。

示例

考虑以下存储MySQL 数据库中的出生日期:

// Store a birthday in UTC:
String query = "INSERT INTO persons (birthday) VALUES (?)";
PreparedStatement statement = connection.prepareStatement(query);
statement.setObject(1, birthday);

// Retrieve birth date from database in UTC:
String query = "SELECT birthday FROM persons WHERE id = ?";
PreparedStatement statement = connection.prepareStatement(query);
statement.setInt(1, personId);
ResultSet resultSet = statement.executeQuery();
LocalDate birthday = resultSet.getObject("birthday", LocalDate.class);
登录后复制

此代码确保存储生日并作为纯日期值检索,没有任何时间或时区信息。

以上是Java 的 java.time API 和 MySQL 的 DATE 类型如何处理没有时间或时区信息的日期?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板