Java数据类型仅保留日期
Java中的哪种数据类型只能包含日期而不需要时间组件? 例如,仅存储12/07/2012
。 我正在将数据保存到具有仅日期数据类型的数据库中,因此我正在寻找Java中最佳的等效数据类型。
来自JDK: java.sql.Date
:
一个围绕毫秒值的瘦包装器,允许JDBC将其标识为SQL DATE值。 毫秒值表示自
January 1, 1970 00:00:00.000 GMT
年January 1, 1970 00:00:00.000 GMT
以来经过的毫秒数。为了符合SQL DATE的定义,
java.sql.Date
实例包含的毫秒值必须通过在与实例关联的特定时区中将小时,分钟,秒和毫秒设置为零来“标准化”。 。
或者来自JodaTime : DateMidnight
或LocalDate
(感谢@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驱动程序可以使用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的讨论和示例。 例如, 我对这个类似问题的回答 。
使用可用的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-lang
类DateUtils
处理这个DateUtils
:
Date myDate = DateUtils.truncate(timestamp, Calendar.DAY_OF_MONTH);
这将删除时间部分并仅保留日期部分。
使用Date类。 这是更好的方法。
如果您使用的是Java 8,则可以使用java.time.LocalDate
。