在应用程序开始时,我使用Java中的timezone.setDefaultTimeZone()
方法将默认时区设置为Australia/Perth。我试图在created_date
列中插入带有澳大利亚时区的时间戳。当调用Spring data JPA的save
方法时,时间戳是澳大利亚时区下午4点。但是,在DB中,它存储为UTC下午4点。我们的Spring配置并不强制JDBC使用UTC时区。未指定此类配置。事实上,UTC根本不在存储库中的任何地方。
问题:我知道JDBC驱动程序决定时区。Q)它不应该总是采用JVM的默认时区吗?在本例中是澳大利亚吗?Q)不管我在代码中设置了什么时区(无论是作为默认时区还是在日期列中),它在数据库中总是UTC。但是时间戳的数字部分是正确的。JDBC是采用DBtimezone而不是JVM的默认时区吗?Q)JDBC采用哪个时区--JVM的默认时区还是DB的'DBtimezone'(在本例中,它碰巧是后者)?或者它可以是任何时区?
信息:DB的dbtimezone-select dbtimezone-asia/calcutta Created_date列的类型为'timestamp WITH timezone'
注意:我尝试了java.time类…OffsetdateTime和ZonedDateTime,但没有成功。
永远不要设置默认时区。这样做会立即影响在该JVM中运行的所有应用程序的所有线程中运行的所有其他代码。而任何其他代码都可以重新设置它。
因此,永远不要编写依赖于JVM当前默认时区的代码。显式指定所需/期望的时区。
我试图在created_date列中插入带有澳大利亚时区的时间戳。
我不使用JPA。但我可以直接向您展示JDBC,
ZoneId z = ZoneId.of( "Australia/Perth" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
OffsetDateTime odt = zdt.toOffsetDateTime() ;
myPreparedStatement.setObject( … , odt ) ;
您可能会感到困惑的是,工具和中间件具有一个不幸的反特性,即在从数据库检索值后但在向您显示之前动态应用默认时区。这就造成了一个不是真的存在的时区的错觉。尝试使用Java从DB检索您的值:
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
在此答案中显示的代码将不会有时区问题。根据我对Postgres和H2的JDBC驱动程序的经验,与服务器或客户端上的任何默认时区都没有交互作用。坚持(a)使用java.time类,(b)始终指定您所需/期望的时区,而不是隐式依赖于默认区域。我不使用Spring或Hibernate,所以我不知道他们是否会在过程中注入一个时区。
问题是Java Date对象不存储时区。该值始终使用UTC,并在给定的时区(通常是JVM的默认时区)中进行解析和格式化。 Oracle日期列也不带时区存储,但应该表示用户看到的日期。在99.99%的情况下,这意味着JVM默认时区中的日期。 因此,JDBC驱动程序采用UTC格式的时间戳/日期值,将其转换为默认时区,并将其保存到数据库中。 null 所以最终的问题是,为什么它是这样设计的?原因何在?
问题内容: 这个问题已经在这里有了答案 : 检查是否存在一行,否则插入 (11个答案) MySQL条件插入 (12个答案) 6年前关闭。 我想运行一组查询以将一些数据插入SQL表中,但前提是要满足满足某些条件的记录。该表有4个字段:(主要),和 我在查询3个字段:,和。 所以我的查询将是这样的: 因此,我只想在与和匹配的记录尚不存在时插入数据。如果上面的方法是正确的,那么我就觉得这是一种效率很低的
问题内容: 如果我创建一个新的Date()对象。它将打印的默认时区是什么。 我的机器在GMT中运行。我正在创建一个新的Date()对象。如果我打印为什么它显示周四7月5日8时21分05秒 PKT 2012年它是如何花费的时区为PKT? 问题答案: 日期本身没有任何时区。它的方法使用当前的默认时区返回表示该日期的字符串: 在我的机器上执行上述代码会导致以下输出:
我收到以下异常- org.hibernate.exception.sqlgrammarexception:无法插入:[Employee] 以下是详细信息: hibernate.cfg.xml employee.hbm.xml 请帮助解决异常。提前道谢!
我想在我的web应用程序中工作在同一时区,我尝试使用de时区默认函数moment.tz.setDefault(“Europe/Madrid”);日期转换(json格式)不正确,默认为一天 http://plnkr.co/edit/xsughtdlufxugcjrwiz?p=preview 谢谢
我在MySQL数据库中有一个表,其中包含一个默认值的列,在数据库端使用phpMyAdmin定义。当我使用HiberNate插入新行时,我得到这个错误: 通用域名格式。mysql。jdbc。例外。jdbc4。MySQLIntegrityConstraintViolationException:列“status”不能为null 我还需要做些什么来使用默认值吗? 实体