java中的datetime数据类型

aks*_*hay 15 java timestamp date

我可以在Java中使用哪种数据类型来保存当前日期和时间?我想将日期时间存储在数据库中,并在java bean中有一个字段来保存它.

java.util.Date吗?

Jon*_*eet 25

java.util.Date表示即时,不参考特定时区或日历系统.它确实保留了日期和时间 - 它基本上是自Unix时代以来的毫秒数.

或者您可以使用java.util.Calendar知道这两点.

我个人强烈建议你使用Joda Time,这是一个丰富的日期/时间API.它允许您更清楚地表达您的数据,包括"只是日期","本地时间","本地日期/时间","即时","带时区的日期/时间"等类型.大多数类型也是不可变的,这在代码清晰度方面是一个巨大的好处.


Rup*_*pok 11

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);
}
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 5

java.time

Java 8和更高版本中内置的java.time框架取代了与最早的Java版本捆绑在一起的旧日期时间类和Joda-Time库。java.time类已反向移植到Java 6和7以及Android。

Instant类表示UTC时间线与纳秒的分辨率上一会儿。

Instant instant = Instant.now();
Run Code Online (Sandbox Code Playgroud)

应用从UTC偏移(数小时以及可能的分钟和秒)以获取OffsetDateTime

ZoneOffset offset = ZoneOffset.of( "-04:00" );
OffsetDateTime odt = OffsetDateTime.ofInstant( instant , offset );
Run Code Online (Sandbox Code Playgroud)

更好的方法是应用一个全时区,该时区是一个偏移量以及一组用于处理异常的规则,例如夏令时(DST)。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
Run Code Online (Sandbox Code Playgroud)

数据库

希望可以将JDBC驱动程序更新为可直接与java.time类一起使用。在此之前,我们必须使用java.sql类将日期时间值移入/移出数据库。但是将您对java.sql类的使用限制为繁琐的数据库传输。不要将它们用于业务逻辑。作为旧的日期时间类的一部分,它们的设计不佳,令人困惑且麻烦。

使用添加到旧类中的新方法来与java.time进行相互转换。寻找to…valueOf方法。

使用java.sql.Timestamp该类作为日期时间值。

java.sql.Timestamp ts = java.sql.Timestamp.valueOf( instant );
Run Code Online (Sandbox Code Playgroud)

并朝着另一个方向…

Instant instant = ts.toInstant();
Run Code Online (Sandbox Code Playgroud)

对于日期时间数据,您实际上总是需要TIMESTAMP WITH TIME ZONE数据类型,而不是WITHOUT在数据库中设计表列时。