【发布时间】:2011-09-24 20:54:00
【问题描述】:
我可以在 Java 中使用哪种数据类型来保存当前日期和时间?我想将日期时间存储在数据库中,并在 java bean 中有一个字段来保存它。
是java.util.Date 吗?
【问题讨论】:
我可以在 Java 中使用哪种数据类型来保存当前日期和时间?我想将日期时间存储在数据库中,并在 java bean 中有一个字段来保存它。
是java.util.Date 吗?
【问题讨论】:
java.util.Date 代表时间的瞬间,与特定时区或日历系统无关。但它确实同时保存了日期和时间——它基本上是自 Unix 纪元以来的毫秒数。
您也可以使用java.util.Calendar,它了解这两件事。
我个人强烈建议您使用Joda Time,这是一个更丰富的日期/时间 API。它允许您更清楚地表达您的数据,类型包括“仅日期”、“仅本地时间”、“本地日期/时间”、“即时”、“带时区的日期/时间”等。大多数类型也是不可变的,这在代码清晰度方面是一个巨大的好处。
【讨论】:
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
private String getDateTime() {
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = new Date();
return dateFormat.format(date);
}
【讨论】:
您可以使用日历。
Calendar rightNow = Calendar.getInstance();
Date4j alternative to Date, Calendar, and related Java classes
【讨论】:
+1 推荐 Joda-time。如果您打算做的不仅仅是一个简单的 Hello World 示例,我建议您阅读以下内容:
【讨论】:
取决于 RDBMS 甚至 JDBC 驱动程序。
大多数时候你可以使用java.sql.Timestamp 和一个准备好的语句:
pstmt.setTimestamp( index, new Timestamp( yourJavaUtilDateInstance.getTime() );
【讨论】:
我使用了这个导入:
import java.util.Date;
并像这样声明我的变量:
Date studentEnrollementDate;
【讨论】:
从 Java 8 开始,java.time 标准库似乎是要走的路。来自Joda time网页:
请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。
回到你的问题。如果你使用 Java 8,我想你想要LocalDateTime。因为它包含日期和时间,但不知道时区或任何参考时间点,例如 unix 纪元。
【讨论】:
LocalDateTime。因为它没有时区或与 UTC 的偏移量,所以它没有真正的意义。这不是时间线上的时刻。在商业应用程序中很少需要。 Instant、OffsetDateTime 和 ZonedDateTime 都用于表示时间轴上的某个时刻。
Java 8 及更高版本中内置的 java.time 框架取代了与 Java 的最早版本和 Joda-Time 库捆绑在一起的旧日期时间类。 java.time 类已向后移植到 Java 6 和 7 以及 Android。
Instant 类代表 UTC 时间轴上的一个时刻,分辨率为纳秒。
Instant instant = Instant.now();
应用与 UTC 的偏移量(小时数和可能的分钟数和秒数)以获得 OffsetDateTime。
ZoneOffset offset = ZoneOffset.of( "-04:00" );
OffsetDateTime odt = OffsetDateTime.ofInstant( instant , offset );
更好的是应用一个完整的时区,它是一个偏移量加上一组处理异常的规则,例如夏令时 (DST)。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
希望 JDBC 驱动程序将被更新以直接与 java.time 类。在此之前,我们必须使用 java.sql 类将日期时间值移入/移出数据库。但是将您对 java.sql 类的使用限制在数据库传输的琐事上。不要将它们用于业务逻辑。作为旧日期时间类的一部分,它们设计不佳、令人困惑且麻烦。
使用添加到旧类的新方法与 java.time 进行转换。寻找to… 和valueOf 方法。
使用java.sql.Timestamp 类作为日期时间值。
java.sql.Timestamp ts = java.sql.Timestamp.valueOf( instant );
然后往另一个方向发展……
Instant instant = ts.toInstant();
对于日期时间数据,在设计数据库中的表列时,您几乎总是需要TIMESTAMP WITH TIME ZONE 数据类型而不是WITHOUT。
【讨论】: