java - ISO 8601 日期格式字符串到 Java 中的 Date 对象
问题描述
我尝试仅搜索不同格式的 ISO 8601 日期的答案,但无法识别包含这些详细信息的答案或材料
我正在尝试接收 ISO 8601 日期格式(日期仅作为其出生日期)字符串并将其转换为日期对象,然后以 dB 为单位。是 yyyy-MM-dd 唯一日期格式,被视为 ISO 8601 日期格式。如果是这样,我可以相应地处理这个问题,但是否有多种日期 ISO 8601 日期格式,如果有,请指导什么是解析给定字符串并转换为 Java 中日期对象的最佳方法
解决方案
是的,yyyy-MM-dd 是 ISO 8601 格式的日期,没有时间和时区。
要使用 JDBC 4.2 或更高版本的驱动程序或现代 JPA 实现(如 Hibernate 5)存储到 SQL 数据库中,您无需使用Date
对象(无论您的意思是java.util.Date
还是java.sql.Date
)。我建议您改用 java.time,这是现代 Java 日期和时间 API。用于没有时间的日期的类是LocalDate
. 您可以将一个存储到您的数据库中而无需任何转换。
LocalDate
将 ISO 8601 格式解析为其默认值,即没有任何显式格式化程序:
String receivedString = "1962-11-27";
LocalDate dateOfBirth = LocalDate.parse(receivedString);
System.out.println("Date of birth is " + dateOfBirth);
LocalDate
当我们打印它时,它还会返回 ISO 8601 格式:
出生日期是 1962-11-27
不过,我还没有给你完整的故事。yyyy-MM-dd 是迄今为止最常用的扩展格式。还有一种更紧凑的基本格式,因为它省略了连字符:yyyyMMdd。我建议您坚持以扩展格式获取日期字符串。如果你不能这样做,你将不得不指定一个格式化程序来解析:
String receivedString = "19621127";
LocalDate dateOfBirth = LocalDate.parse(
receivedString, DateTimeFormatter.BASIC_ISO_DATE);
这将为您提供LocalDate
与我们之前拥有的相同且无法区分的内容。
要使用 JDBC 保存到数据库中:
PreparedStatement pStmt
= yourDatabaseConnection.prepareStatement(
"insert into your_table (date_of_birth) values (?);");
pStmt.setObject(1, dateOfBirth);
int insertedRows = pStmt.executeUpdate();
注意使用setObject()
,不是setDate()
。
链接
- 维基百科文章:ISO 8601
- Oracle 教程:日期时间解释如何使用 java.time。
- Java 规范请求 (JSR) 310,
java.time
第一次描述的地方。 - ThreeTen Backport 项目,
java.time
Java 6 和 7 的反向移植(ThreeTen for JSR-310)。 - ThreeTenABP , ThreeTen Backport 的 Android 版
- 问题:如何在Android项目中使用ThreeTenABP,有非常详尽的解释。
- 相关问题:在 SQL 数据库(如 H2)中插入和获取 java.time.LocalDate 对象
推荐阅读
- ios - 带有 Swift 5.0 编译器的 Xcode 10.2 - 协议继承问题
- git - git reset --soft "HEAD^6" 是什么意思?
- java - 无法使用模拟来抛出异常 - 抛出的异常没有被捕获
- amazon-web-services - 如何使用对象标记上传到 AWS S3
- python - 我如何阅读 JSON 语法图?
- filter - PowerBi - 上周演出(周一至周日)
- firebase - 在打字稿中部署firebase云功能
- ios - 为什么不能调用该方法?
- swift - 如何在swift 4中检查报价?
- visual-c++ - 如何获得以毫米 (mm) 为单位的 MFC 视图?