我试图从数据库中获取时间戳值,将其转换为日历,然后将其转换回时间戳,但它们失去了精度。
这是重现问题的代码
import java.sql.Timestamp;
import java.util.Calendar;
public class Test {
public static void main(String[] args)
{
Timestamp timestamp = new Timestamp(112, 10, 5, 15, 39, 11, 801000000);
System.out.println("BEFORE "+timestamp.toString());
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timestamp.getTime());
timestamp = new Timestamp(calendar.getTimeInMillis());
System.out.println("AFTER "+timestamp.toString());
}
}
这是转换的样本结果
BEFORE 2012-10-18 14:30:13.362001
AFTER 2012-10-18 14:30:13.362
它失去了精确性。我该怎么做才能保持十进制值不变?
在Java8及以后,我们现在有了一个解决方案:内置了新的java.time框架。由JSR 310定义,受Joda-Time启发,由ThreePre-Extra项目扩展。
这个新框架的分辨率为纳秒。这就足以处理旧java了。util。日期值,Joda时间值,都是毫秒。它足以处理一些数据库(如Postgres)使用的微秒。一些数据库(如H2)使用纳秒。所以java。时间可以处理一切,至少可以处理所有的主流情况。唯一的例外是特殊的科学或工程情况。
通过Java8,旧的类获得了转换到/从java.time.Onjava.sql.Timestamp的新方法,使用了新的toInstant
和fromInstant
方法。Instant
类包含一个从1970 UTC的第一个时刻开始的纳秒计数(基本上,请参阅类doc了解详细信息)。
从即时
可以获得ZoneDateTime
对象。
java.sql.Timestamp ts = myResultSet.getTimestamp( 1 );
Instant instant = ts.toInstant();
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( zoneId );
您以毫秒为单位设置时间,但您的输入精度以微秒为单位,因此您当然会损失任何小于毫秒的精度。
日历不支持比毫秒更细的粒度。周围没有工作。
我正在尝试将日期插入我的PostgreSQL数据库。以下是我在java应用程序中解析日期的方式: 在我的PostgreSQL数据库中。我将其作为带有时区的。处理和插入它的理想方式是什么? 数据库期望的示例。
问题内容: 我尝试将其转换为java.sql.Timestamp后插入,并使用以下代码段: 但是,这是给我的 有没有办法在没有毫秒的情况下获得输出? 问题答案: 您可以使用来减少毫秒数: 输出:
问题内容: 如何将Unix时间戳中的时间转换为正常时间? 问题答案: 您的问题含糊不清。我将消除时区的歧义。 如何将Unix时间戳中的时间转换为正常时间? 我怀疑您是以某种方式从数据库而不是从中获取或一个值。在JDBC中,通常希望使用适当的方法来获取特定于DB的数据类型。可以获取MySQL 数据类型,从而为您提供,而后者又是的子类。 简而言之,应该执行以下操作: 要将其呈现给最终用户时,要以人类可
从我的数据库我检索值为: 我想要上面的: 我试着用当前的时间戳跟踪 实际时间戳:2018年6月22日星期五16:07:35 更新了,我不想更新,有没有办法保持原样?
问题内容: 我有一个数据库,它将具有标准sql格式的UMT时间戳。如何提取数据并为其设置Java日期对象? 据我所知mysql是 至于Java,日期/时间的东西一直躲着我。 如果有人为此知道一个好的图书馆,我欢迎您提出建议。 问题答案: 为什么不直接阅读为 看到
问题内容: 我有以下整数形式的时间戳 我可以使用SQL进行转换: 如何在Java中转换它?这样它将返回值: 问题答案: 假设自1970年1月1日以来的时间(以秒为单位)。你可以试试