问题 Java数据类型仅保留日期


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


8710
2018-06-18 13:14


起源



答案:


来自JDK: java.sql.Date

围绕毫秒值的薄包装器,允许JDBC识别   这是一个SQL DATE值。毫秒值表示数字   从那以后经过的毫秒数 January 1, 1970 00:00:00.000 GMT

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

或来自 JodaTimeDateMidnight 要么 LocalDate (谢谢 @cdeszaq)

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

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


5
2018-06-18 13:20



+1引用JodaTime。还有 LocalDate JodaTime中的类,它只代表日期组件。它不是一个完全干净的合身,但它在过去一直适用于我的需求。 - cdeszaq
@cdeszaq感谢提示 - Sean Patrick Floyd
与午夜相关的类和方法已被弃用,不应使用。见 withTimeAtStartOfDay 方法。此外,Joda-Time的制造商建议我们迁移到java.time框架。 - Basil Bourque


答案:


来自JDK: java.sql.Date

围绕毫秒值的薄包装器,允许JDBC识别   这是一个SQL DATE值。毫秒值表示数字   从那以后经过的毫秒数 January 1, 1970 00:00:00.000 GMT

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

或来自 JodaTimeDateMidnight 要么 LocalDate (谢谢 @cdeszaq)

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

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


5
2018-06-18 13:20



+1引用JodaTime。还有 LocalDate JodaTime中的类,它只代表日期组件。它不是一个完全干净的合身,但它在过去一直适用于我的需求。 - cdeszaq
@cdeszaq感谢提示 - Sean Patrick Floyd
与午夜相关的类和方法已被弃用,不应使用。见 withTimeAtStartOfDay 方法。此外,Joda-Time的制造商建议我们迁移到java.time框架。 - Basil Bourque


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


2
2018-06-18 13:15





其他答案已过时。

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

java.time

java.time 框架内置于Java 8及更高版本中。看到 Oracle教程。 java.time的大部分功能都是 后移到Jave 6和7 并进一步 适应Android

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

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

文字表示

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

localDate.toString()→2012-12-07

对于其他格式使用 DateTimeFormatter

SQL

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

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

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

而另一个方向。

LocalDate localDate = sqlDate.toLocalDate();

搜索堆栈溢出

搜索堆栈溢出 许多 更多讨论和使用java.time的例子。例如, 我的答案 至 这个类似的问题


2
2018-04-11 15:43





使用 日期 可用的课程。


1
2018-06-18 13:16





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

formatter = new SimpleDateFormat("dd/MM/yyyy");

Date date= new Date();

Date todayWithOutTime =formatter.parse(formatter.format(date));

1
2018-06-18 13:25





可惜的是, java.util.Date 是一种东西,在SQL中有名称 Timestamp。仅限日期没有纯类型, javax.sql.Date 扩展 java.util.Date 并且在Java中使用此类型进行日期操作不会给您带来任何好处。

我正在使用apache处理这个问题 commons-lang 类 DateUtils

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

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


1
2018-06-18 14:49





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


1
2018-04-30 08:11





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


1
2017-10-02 02:34