Oracle 为什么用户输入的日期减少了一天?(但不是在本地运行时?)
首先,我希望这是提出这个问题的正确地点。因为我认为这是一个服务器配置问题,所以我不确定这是否应该发生在serverfault上 因此,我们有一个运行在Tomcat服务器上并连接到Oracle数据库的spring mvc webapp。其中一个页面上有一个表单供用户填写,用户可以在其中输入一组日期。当我或其他开发人员在我们自己的机器上本地运行webapp进行测试(仍然连接到外部Oracle实例)时,我们没有问题。但是现在webapp已经部署到两个不同的外部Tomcat服务器上,我们注意到了日期问题 在数据从页面提交(使用Firefox的TamperData插件验证)到控制器和插入数据库之间,所有这些用户输入的日期都会丢失一天。例如,输入09/02/2010将作为09/01/2010插入表中。如果我们提交的是2010年1月9日,则插入为2010年8月31日。在我们的代码中,这些用户日期从未被显式修改 我们的spring实体bean中的这些日期字段使用以下注释:Oracle 为什么用户输入的日期减少了一天?(但不是在本地运行时?),oracle,hibernate,tomcat,date,spring-mvc,Oracle,Hibernate,Tomcat,Date,Spring Mvc,首先,我希望这是提出这个问题的正确地点。因为我认为这是一个服务器配置问题,所以我不确定这是否应该发生在serverfault上 因此,我们有一个运行在Tomcat服务器上并连接到Oracle数据库的spring mvc webapp。其中一个页面上有一个表单供用户填写,用户可以在其中输入一组日期。当我或其他开发人员在我们自己的机器上本地运行webapp进行测试(仍然连接到外部Oracle实例)时,我们没有问题。但是现在webapp已经部署到两个不同的外部Tomcat服务器上,我们注意到了日期问题
@Temporal(value = TemporalType.DATE)
@Column(name = "START_DATE", nullable = false, length = 7)
@DateTimeFormat(pattern="MM/dd/yyyy")
此外,在数据处理过程中的某个时刻。我们设置了一个具有当前日期的字段:
obj.setActivityDate(new Date());
当我们检查数据库时,这些活动日期是不变的,并且始终带有正确的日期
就像我说的,当我们在本地运行应用程序时,我们无法重现这个错误,所以我们(希望)相信问题出在我们部署到的其他Tomcat服务器上。以前有没有人遇到过这样的问题,或者你知道是什么原因造成的吗
更新:
所以我接受了时区提示,它让我们朝着正确的方向前进,但我们还没有到达那里。我进入实体bean,将字段从java.util.Date更改为jodaTime DateTime对象,如下所示:
@Column(name = "START_DATE", nullable = false, length = 7)
@DateTimeFormat(pattern="MM/dd/yyyy")
@Type(type = "org.joda.time.contrib.hibernate.PersistentDateTime")
private DateTime startDate;
在进行调整以处理新类型之后,我运行了更多的测试,现在我们可以看到日期09/01/2010被插入到数据库中,日期为08/31/2010 8:00:00 pm。我认为TemporalType=DATE可能在这条线的某个地方强制进行了截断,这就是为什么我们以前没有看到时间戳的原因。以下是我知道的时区设置(我们的办公室位于美国东部的弗吉尼亚州):
- Tomcat启动时时区设置为EST5EDT
- 托管Tomcat的linux服务器设置为EST
- 托管Oracle实例的linux服务器设置为EST
- Oracle数据库时区设置为UTC(+00:00)
- Oracle中用户会话的时区(当前)设置为-04:00
Storing date startDate: 2010-09-01T00:00:00.000
Storing date startDate: 2010-09-01T00:00:00.000-04:00
当在外部Tomcat服务器上运行时,这些日期中的每一个都是从Tomcat(带Spring/Hibernate)以2010年8月31日晚上8:00的时间进入数据库的,但当在本地运行时,则以2010年9月1日上午12:00的时间插入数据库。到目前为止,这样做的唯一好处是,当从数据库中提取日期并在屏幕上显示给用户时,日期会被重新翻译,以便与用户最初键入的日期匹配
为了能够持续地开发,我们需要知道本地机器上可能缺少的避免此问题的设置。我们目前正在使用Tomcat 6.0.20,与NetBeans捆绑在一起在本地运行。作为一个想法:
与时区有关。如果您提交一个带有一个时区信息的日期时间值,则数据库将配置为使用另一个时区,以便动态转换您的日期
几个小时已经可以改变了。你插入了一个09/01/2010 01:55,它很容易变成08/31/2010 23:55。这里有很多提示:@BalusC Wow,这是一个很好的问题(立即受到欢迎)。谢谢