我尝试仅搜索不同格式的 ISO 8601 日期的答案,但无法识别包含这些详细信息的答案或 Material
我正在尝试接收 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 格式:
Date of birth is 1962-11-27
不过,我还没有给你完整的故事。 yyyy-MM-dd 是迄今为止最常用的扩展格式。还有一种更紧凑的基本格式,因为它省略了连字符:yyyyMMdd。我建议您坚持以扩展格式获取日期字符串。如果您无法做到这一点,则必须指定一个格式化程序来进行解析:
String receivedString = "19621127";
LocalDate dateOfBirth = LocalDate.parse(
receivedString, DateTimeFormatter.BASIC_ISO_DATE);
这将为您提供一个 LocalDate
,该 LocalDate
与我们之前的相同并且没有区别。
使用 JDBC 保存到数据库中:
PreparedStatement pStmt
= yourDatabaseConnection.prepareStatement(
"insert into your_table (date_of_birth) values (?);");
pStmt.setObject(1, dateOfBirth);
int insertedRows = pStmt.executeUpdate();
请注意使用setObject()
,而不是setDate()
。
链接
- Wikipedia article: ISO 8601
- Oracle tutorial: Date Time解释如何使用 java.time。
- Java Specification Request (JSR) 310 ,其中首次描述了 java.time。
- ThreeTen Backport project ,
java.time
向 Java 6 和 7 的向后移植(对于 JSR-310,为 ThreeTen)。 - ThreeTenABP , Android 版 ThreeTen Backport
- Question: How to use ThreeTenABP in Android Project ,有非常详尽的解释。
- 相关问题:Insert & fetch java.time.LocalDate objects to/from an SQL database such as H2
关于java - ISO 8601 日期格式字符串到 Java 中的 Date 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61047661/