Java 中的哪种数据类型可以只保存日期而不需要时间组件?例如,只是为了存储12/07/2012
. 我正在将数据持久化到/从具有仅日期数据类型的数据库中,因此我正在寻找 Java 中最好的等效数据类型。
8 回答
来自 JDK: java.sql.Date
:
一个围绕毫秒值的瘦包装器,允许 JDBC 将其识别为 SQL DATE 值。毫秒值表示自 以来经过的毫秒数
January 1, 1970 00:00:00.000 GMT
。为了符合 SQL DATE 的定义,由
java.sql.Date
实例包装的毫秒值必须通过在与实例关联的特定时区中将小时、分钟、秒和毫秒设置为零来“规范化”。
或来自JodaTime:DateMidnight
或LocalDate
(感谢@cdeszaq)
DateMidnight
定义时间分量固定在午夜的日期。该类使用时区,因此午夜是本地的,除非使用 UTC 时区。重要的是要强调这个类代表任何一天的午夜时间。请注意,午夜被定义为 00:00,即一天的开始。
其他答案已过时。
旧的日期时间类是出了名的麻烦,应该避免。
java.time
java.time框架内置于 Java 8 及更高版本中。请参阅Oracle 教程。大部分 java.time 功能向后移植到 Jave 6 和 7并进一步适应 Android。
该类LocalDate
表示没有时间和时区的仅日期值。
LocalDate localDate = LocalDate.of( 2012 , 12 , 7 );
文本表示
该方法使用标准ISO 8601格式toString
生成字符串。
localDate.toString() → 2012-12-07
对于其他格式,请使用DateTimeFormatter
.
SQL
符合JDBC 4.2的JDBC 驱动程序可以使用getObject
和setObject
方法直接获取/传递 java.time 类型,例如LocalDate
SQL 类型DATE
。
如果您的驱动程序不能这样做,请回退到使用 java.sql 类型。新方法已添加到旧类中以方便转换。
java.sql.Date sqlDate = java.sql.Date.valueOf( localDate );
而另一个方向。
LocalDate localDate = sqlDate.toLocalDate();
搜索堆栈溢出
搜索 Stack Overflow 以获取更多关于使用 java.time 的讨论和示例。例如,我对这个类似问题的回答。
日期类。它拥有一个 UNIX 时间戳。在大多数数据库中,您也可以指定一个字段来保存时间戳。您可以根据需要使用 DateFormat 格式化时间戳。
如果您使用的是 Java 8,则可以使用java.time.LocalDate
.
使用可用的Date类。
它显示了如何只保留日期(没有时间)
formatter = new SimpleDateFormat("dd/MM/yyyy");
Date date= new Date();
Date todayWithOutTime =formatter.parse(formatter.format(date));
不幸java.util.Date
的是,在 SQL 中有 name Timestamp
。仅 Date 没有纯类型,在 Java 中javax.sql.Date
扩展java.util.Date
和使用这种类型进行日期操作没有任何优势。
commons-lang
我正在使用 apache类处理这个问题DateUtils
:
Date myDate = DateUtils.truncate(timestamp, Calendar.DAY_OF_MONTH);
这将删除时间部分,只留下日期部分。
使用日期类。这是更好的方法。