在java中将unix时间戳转换为与postgres等效的时间戳
我在博士后有一个领域在java中将unix时间戳转换为与postgres等效的时间戳,java,postgresql,Java,Postgresql,我在博士后有一个领域 Column | Type created_at | timestamp without time zone 我有一个unix时间戳存储在Java的long中 long createdAtTime = data.getcreatedAtTime(); 我想用java将其转换为时间戳,这样我就可以用activejdbc将其存储到postgres中 我尝试了以下方法 Date convertedTime = new
Column | Type
created_at | timestamp without time zone
我有一个unix时间戳存储在Java的long中
long createdAtTime = data.getcreatedAtTime();
我想用java将其转换为时间戳,这样我就可以用activejdbc将其存储到postgres中
我尝试了以下方法
Date convertedTime = new Date(createdAtTime*1000L);
record.set("created_at", convertedTime);
record.saveIt();
但我得到了以下错误:
Can't infer the SQL type to use for an instance of java.util.Date. Use setObject() with an explicit Types value to specify the type to use.
我应该先使用不同的方式转换日期吗
java.sql.Timestamp timestamp = new Timestamp(createdAtTime*1000L);
record.set("created_at", convertedTime);
record.saveIt();
您尝试使用java.sql.Date而不是util。
它是SQL的本机类型。不兼容的类型
我在博士后有一个领域
没有时区的时间戳
……还有
我有一个unix时间戳存储在Java的long中
long createdAtTime = data.getcreatedAtTime();
长createdAtTime=data.getcreatedAtTime
这是一个矛盾
没有时区的SQL标准类型时间戳故意缺少或的任何指示符。因此,这种类型并不代表一个时刻,也不是时间线上的一个点。这种类型代表大约26-27小时范围内的潜在时刻,即全球的时区范围
如果您试图跟踪特定时刻,请使用另一种SQL标准类型TIMESTAMP WITH TIME ZONE。在Postgres中,此类型的所有值都存储在零偏移量中。如果您传递一个指示其他偏移或时区的值,Postgres会在存储之前将该值调整为UTC
从Postgres中带有时区的TIMESTAMP类型的列中检索值时,总是以UTC为单位获取值。不幸的是,一些位于您和数据库之间的善意工具或驱动程序可能决定动态地将时区应用于该值。虽然好心,我认为这相当反特性。这种行为造成了在数据库中存储时区的假象,而实际上Postgres只在这种类型中存储UTC
日期转换时间=新建日期创建日期时间*1000L
java.util.Date类糟糕透顶,设计拙劣,存在缺陷。不要使用此类及其同级、日历、SimpleDataFormat等。这些都是遗留的,几年前被JSR310中定义的现代java.time类所取代
瞬间
Instant类将接管java.util.Date。这两个类都代表UTC中的一个时刻,尽管Instant的分辨率为纳秒而不是毫秒
unix时间戳在Java中以长格式存储
long createdAtTime = data.getcreatedAtTime();
如果以UTC 1970-01-01T00:00:00Z为单位,从1970年第一个时刻的历元参考中有整秒计数,请转换为一个瞬间
提示:不要养成从历元开始计算时间的习惯。这是不明确的,不同的系统使用不同的分辨率和不同的历元引用,容易出错,并且使调试/记录变得危险。使用java.time对象和标准ISO 8601字符串表示日期时间值
您的JDBC驱动程序可能能够接受即时消息
检索:
Instant instant = myResultSet.getObject( … , Instant.class ) ;
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
抵销日期时间
如果不支持Instant,请使用convert to OffsetDateTime。任何JDBC4.2或更高版本的驱动程序都需要支持OffsetDateTime
OffsetDateTime表示从UTC偏移的日期和时间。相比之下,Instant固定在UTC,作为java.time框架中的基本构建块类。此外,OffsetDateTime具有更灵活的功能,例如以各种格式生成字符串,而不是仅使用标准ISO 8601格式生成即时字符串
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
myPreparedStatement.setObject( … , odt ) ;
检索:
Instant instant = myResultSet.getObject( … , Instant.class ) ;
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
……或者
Instant instant = myResultSet.getObject( … , OffsetDateTime.class ).toInstant() ;
LocalDateTime
如果不尝试表示时刻,例如不带时区的数据库类型TIMESTAMP,请使用LocalDateTime类
但是,如果您认为使用这些类型在某种程度上避免了在跟踪时刻时使用时区的工作,那么您就大错特错了。这是一种“立即付款或稍后付款”的情况:要么现在就学习基本的日期时间概念和处理实践,要么以后拼命地处理一堆糟糕的失败数据
关于java.time
该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&
该项目现已启动,建议迁移到类
要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是
您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要java.sql.*类
从哪里获得java.time类
、和更高版本-标准Java API的一部分,带有捆绑实现。
Java9添加了一些次要功能和修复。
和
大多数java.time功能都在中向后移植到Java6和Java7。
更高版本的Android捆绑包实现了java.time类。
对于早期的Android我看到您的数据库列将值存储为不带时区的时间戳, 你为什么不试试这个
Timestamp current = Timestamp.from(Instant.now());
record.set("created_at", current);//I don't know if you might need to parse
record.saveIt();
您需要使用java.sql.Timestamp,而不是的java.util.Date.mable副本。和顺便说一句,您应该使用带时区的时间戳,而不是不带时区的时间戳。根据博士后专家的说法,这个答案是不正确的。A是我吗
仅指定日期值,不指定一天中的时间。不是问题所要求的。java.sql.Date将截断时间。@BoristheSpider我们可以用于该java.sql。Timestamp@BasilBourque这怎么可能是错误的答案。我们可以在中使用java.sql.Date或java.sql.TimeStamp作为日期database@SivaKumar一个java.sql.Date将其内部时间设置为00:00:00,这是一种黑客行为,用来假装只有日期而没有一天中的时间。用户的问题是跟踪创建数据的时刻。您的答案会丢失数据,即数据库中时间戳的时间部分。我认为不必要地丢失数据的答案是错误的。如果我误解了什么,请纠正我。