【发布时间】:2012-06-18 13:14:25
【问题描述】:
Java 中哪种数据类型可以只保存日期而不需要时间组件?例如,只存储12/07/2012。我正在将数据持久化到/从具有仅日期数据类型的数据库中,因此我正在寻找 Java 中最好的等效数据类型。
【问题讨论】:
标签: java
Java 中哪种数据类型可以只保存日期而不需要时间组件?例如,只存储12/07/2012。我正在将数据持久化到/从具有仅日期数据类型的数据库中,因此我正在寻找 Java 中最好的等效数据类型。
【问题讨论】:
标签: java
来自 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, 这是一天的开始。
【讨论】:
LocalDate 类,它仅代表日期组件。这不是一个完全干净的合身,但它在过去满足了我的需求。
withTimeAtStartOfDay 方法。此外,Joda-Time 的制造商建议我们迁移到 java.time 框架。
java.sql.Date 正是我所需要的。我正在使用java.utils.Date,而 json 序列化程序搞砸了。
其他答案已过时。
旧的日期时间类是出了名的麻烦,应该避免。
java.time 框架内置于 Java 8 及更高版本中。见Oracle Tutorial。 java.time 的大部分功能是back-ported to Jave 6 & 7 和adapted to Android。
LocalDate 类表示没有时间和时区的仅日期值。
LocalDate localDate = LocalDate.of( 2012 , 12 , 7 );
toString 方法使用标准ISO 8601 格式生成一个字符串。
localDate.toString() → 2012-12-07
对于其他格式,请使用DateTimeFormatter。
JDBC drivers 兼容JDBC 4.2 可以使用getObject 和setObject 方法直接将LocalDate 等java.time 类型获取/传递给SQL 类型DATE。
如果您的驱动程序不能这样做,请回退到使用 java.sql 类型。新方法已添加到旧类中以方便转换。
java.sql.Date sqlDate = java.sql.Date.valueOf( localDate );
还有另一个方向。
LocalDate localDate = sqlDate.toLocalDate();
在 Stack Overflow 上搜索 许多 更多关于使用 java.time 的讨论和示例。例如,my answer 到 this similar Question。
【讨论】:
日期类。它拥有一个 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 中的名称为 Timestamp。没有纯日期类型,javax.sql.Date 扩展了java.util.Date,在 Java 中使用这种类型进行日期操作没有任何优势。
我正在使用 apache commons-lang class DateUtils 处理这个问题:
Date myDate = DateUtils.truncate(timestamp, Calendar.DAY_OF_MONTH);
这将删除时间部分,只留下日期部分。
【讨论】:
使用日期类。这是更好的方法。
【讨论】: