java中的日期时间数据类型

java中的日期时间数据类型,java,date,timestamp,Java,Date,Timestamp,在Java中,我可以使用哪种数据类型来保存当前日期和时间?。我希望将日期时间存储在db中,并在JavaBean中有一个字段来保存它 是不是java.util.Date?java.util.Date表示时间上的一个瞬间,不涉及特定的时区或日历系统。但它同时保存日期和时间——从Unix时代开始,它基本上是毫秒数 或者,您可以使用java.util.Calendar,它确实知道这两件事 我个人强烈建议您使用更丰富的日期/时间API。它允许您更清晰地表达数据,包括“just dates”、“just l

在Java中,我可以使用哪种数据类型来保存当前日期和时间?。我希望将日期时间存储在db中,并在JavaBean中有一个字段来保存它


是不是
java.util.Date

java.util.Date
表示时间上的一个瞬间,不涉及特定的时区或日历系统。但它同时保存日期和时间——从Unix时代开始,它基本上是毫秒数

或者,您可以使用
java.util.Calendar
,它确实知道这两件事

我个人强烈建议您使用更丰富的日期/时间API。它允许您更清晰地表达数据,包括“just dates”、“just local times”、“local date/time”、“instant”、“date/time with time zone”等类型。大多数类型也是不可变的,这在代码清晰性方面是一个巨大的优势。

您可以使用日历

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();


+1关于Joda时间的建议。如果您计划做的不仅仅是一个简单的Hello World示例,我建议您阅读以下内容:


取决于RDBMS甚至JDBC驱动程序

大多数情况下,您可以在准备好陈述的同时使用大多数时间:

pstmt.setTimestamp( index, new Timestamp( yourJavaUtilDateInstance.getTime() );
我使用了这个导入:

import java.util.Date;
并声明我的变量如下:

Date studentEnrollementDate;

自Java8以来,标准库似乎是一种发展方向。从网页:

注意,从JavaSE8开始,用户被要求迁移到Java.time(JSR-310)——JDK的核心部分,它取代了这个项目


回到你的问题上来。如果你想使用Java8,我想你是想要的。因为它包含一天中的日期和时间,但不知道时区或任何时间参考点,如unix纪元。

java.time java 8及更高版本中内置的java.time框架取代了与最早版本的java捆绑在一起的旧日期时间类和Joda时间库。time类已经被向后移植到Java6&7和Android

Instant
类以UTC表示时间线上的一个时间点,分辨率为纳秒

Instant instant = Instant.now();
应用UTC的偏移量(小时数和可能的分秒数)以获得
OffsetDateTime

ZoneOffset offset = ZoneOffset.of( "-04:00" );
OffsetDateTime odt = OffsetDateTime.ofInstant( instant , offset );
更好的方法是应用一个完整的时区,它是一个偏移量加上一组处理异常的规则,例如夏令时(DST)

数据库 希望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();

对于日期-时间数据,在数据库中设计表列时,您几乎总是希望使用带时区的
时间戳
数据类型,而不是不带

我可以将其映射到db(mysql)中的时间戳吗?是的,您可以映射db中的时间戳。使用java.time是正确的,但使用
LocalDateTime
是错误的。因为它没有时区或UTC的偏移量,所以它没有真正的意义。这不是时间表上的一个时刻。在商业应用程序中很少需要。Instant、OffsetDateTime和ZoneDateTime都用于表示时间线上的某个时刻。@BasilBourque是的,这是一个很好的重新表述。虽然手头的问题并没有具体到足以说明什么是对的,什么是错的。大家都同意,这个问题并不清楚,而且相当贫乏,缺乏细节。但它确实显示了“当前”日期和时间,这几乎肯定应该被划分。我的错,进入了错误的文档。我的评论显然具有误导性,我将删除它。
Instant instant = ts.toInstant();