postgresql日期与java日期的关系如何?

postgresql日期与java日期的关系如何?,java,postgresql,timestamp,Java,Postgresql,Timestamp,我正在从事一个项目,该项目要求获得新客户创建其帐户的时间,然后将该时间保存在数据库中以备将来使用。然而,我并不真正理解postgresql的时间戳数据类型?它是相对于java的日历或日期对象的字符串吗(请给我一个插入和检索的示例)?正如@MadProgrammer提到的,时间戳和日期在java和Postgres中都是不同的。虽然可以使用java.sql.Timestamp,但我通常在POJO中将PostgresTimestamps表示为Strings 这样做的原因是,它消除了与时间戳(时区、不同

我正在从事一个项目,该项目要求获得新客户创建其帐户的时间,然后将该时间保存在数据库中以备将来使用。然而,我并不真正理解postgresql的时间戳数据类型?它是相对于java的日历或日期对象的字符串吗(请给我一个插入和检索的示例)?

正如@MadProgrammer提到的,
时间戳和
日期在java和Postgres中都是不同的。虽然可以使用
java.sql.Timestamp
,但我通常在POJO中将Postgres
Timestamp
s表示为
String
s

这样做的原因是,它消除了与时间戳(时区、不同格式等)相关的许多潜在问题,因为人们可以简单地使用
时间戳的Postgres文本表示,并且它仍然可以与Postgres一起来回传递。如果你真的需要它在Java端成为一个
时间戳
,这个规则的例外是因为,比方说,你正在将它从Postgres外部ETL到其他平台,因此不能像从Postgres获取数据并将其放回Postgres中那样依赖Postgres文本表示

假设您有一个时间戳是
2014-08-08 02:11:21.215428
,并且有这样一个表:

create table foo
(
  id serial,
  created timestamp without time zone default now(),
  notes text
);
class FooBean
{
    int id;
    String created;
    String notes;
};
您可以在POJO中这样表示:

create table foo
(
  id serial,
  created timestamp without time zone default now(),
  notes text
);
class FooBean
{
    int id;
    String created;
    String notes;
};
要记住的关键是,如果要在另一个查询中使用该值,则需要将其转换回
时间戳
(即
notes::timestamp
),否则Postgres将抛出转换异常

根据OP的评论进行编辑:

这种方法也有助于消除与时区相关的头痛问题。时区也可以用文本表示,只需通过字符串上的
-XX
表达式即可。例如,无时区字符串
2014-08-08 02:11:21.215428
可以通过字符串
2014-08-08 02:11:21.215428-04
表示时区


正如@MadProgrammer在下面的评论中提到的,Postgres也有一个带有时区的时间戳类型;在上面的例子中,我碰巧选择了没有的。

请注意,
时间戳
日期
不同,
时间戳
包含日期和时间信息,而就PosgreSQL而言,
日期只包含日期信息<代码>时间戳
。据我所知,pg
Timestamp
应该映射到
java.sql.Timestamp
谢谢。这是我关心的问题。谢谢你的建议。我还想把它表示为一个字符串。但是,我对如何处理不同的时区没有确切的概念,因此我认为postgresql时间戳将节省一些额外的步骤。@user3819470如果需要管理时区,postgresql有一个带有时区类型的
时间戳
。一旦程序中有了时区信息,您就可以始终维护没有时区信息的数据,并将其转换为本地时间(带时区),但这一切都取决于上下文