Java数据类型仅保留日期

Java中的哪种数据类型只能包含日期而不需要时间组件? 例如,仅存储12/07/2012 。 我正在将数据保存到具有仅日期数据类型的数据库中,因此我正在寻找Java中最佳的等效数据类型。

来自JDK: java.sql.Date

一个围绕毫秒值的瘦包装器,允许JDBC将其标识为SQL DATE值。 毫秒值表示自January 1, 1970 00:00:00.000 GMTJanuary 1, 1970 00:00:00.000 GMT以来经过的毫秒数。

为了符合SQL DATE的定义, java.sql.Date实例包含的毫秒值必须通过在与实例关联的特定时区中将小时,分钟,秒和毫秒设置为零来“标准化”。 。

或者来自JodaTime : DateMidnightLocalDate (感谢@cdeszaq)

DateMidnight定义时间组件在午夜固定的日期。 该类使用时区,因此午夜是本地的,除非使用UTC时区。

重要的是要强调这个类代表任何一天的午夜时间。 请注意,午夜定义为00:00,即一天的开始。

日期类。 它包含一个UNIX时间戳。 在大多数数据库中,您还可以指定一个字段来保存时间戳。 您可以使用DateFormat格式化时间戳,但需要。

其他答案已过时。

旧的日期时间类是众所周知的麻烦,应该避免。

java.time

java.time框架内置于Java 8及更高版本中。 请参阅Oracle教程 。 大部分java.timefunction都被反向移植到Jave 6和7,并进一步适应了Android 。

LocalDate类表示没有时间且没有时区的仅日期值。

 LocalDate localDate = LocalDate.of( 2012 , 12 , 7 ); 

文字表示

toString方法使用标准ISO 8601格式生成String。

localDate.toString()→2012-12-07

对于其他格式,请使用DateTimeFormatter

SQL

符合JDBC 4.2的 JDBC驱动程序可以使用getObjectsetObject方法直接获取/传递java.time类型(如LocalDate到SQL类型DATE

如果您的驱动程序无法执行此操作,请回退到使用java.sql类型。 旧类中添加了新方法以便于转换。

 java.sql.Date sqlDate = java.sql.Date.valueOf( localDate ); 

而另一个方向。

 LocalDate localDate = sqlDate.toLocalDate(); 

搜索堆栈溢出

搜索Stack Overflow以获取更多有关使用java.time的讨论和示例。 例如, 我对这个类似问题的回答 。

使用可用的Date类。

它显示了如何只持有日期(没有时间)

 formatter = new SimpleDateFormat("dd/MM/yyyy"); Date date= new Date(); Date todayWithOutTime =formatter.parse(formatter.format(date)); 

不幸的是, java.util.Date是一种东西,在SQL中有名称Timestamp 。 对于Date,没有纯类型, javax.sql.Date扩展了java.util.Date并且在Java java.util.Date使用此类型进行日期操作没有任何优势。

我正在使用apache commons-langDateUtils处理这个DateUtils

 Date myDate = DateUtils.truncate(timestamp, Calendar.DAY_OF_MONTH); 

这将删除时间部分并仅保留日期部分。

使用Date类。 这是更好的方法。

如果您使用的是Java 8,则可以使用java.time.LocalDate