Oracle 为什么用户输入的日期减少了一天?(但不是在本地运行时?)

Oracle 为什么用户输入的日期减少了一天?(但不是在本地运行时?),oracle,hibernate,tomcat,date,spring-mvc,Oracle,Hibernate,Tomcat,Date,Spring Mvc,首先,我希望这是提出这个问题的正确地点。因为我认为这是一个服务器配置问题,所以我不确定这是否应该发生在serverfault上 因此,我们有一个运行在Tomcat服务器上并连接到Oracle数据库的spring mvc webapp。其中一个页面上有一个表单供用户填写,用户可以在其中输入一组日期。当我或其他开发人员在我们自己的机器上本地运行webapp进行测试(仍然连接到外部Oracle实例)时,我们没有问题。但是现在webapp已经部署到两个不同的外部Tomcat服务器上,我们注意到了日期问题

首先,我希望这是提出这个问题的正确地点。因为我认为这是一个服务器配置问题,所以我不确定这是否应该发生在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中的这些日期字段使用以下注释:

@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
如果仅此而已,那么我就可以理解为什么用户输入的日期(没有明确的时区)会在数据库中转换为-04:00。但我们仍然无法在我们自己的机器上重现这个问题(Windows7和Fedora,都设置为US/Eastern)。我曾试图通过操纵日期来强制设定时区,但它总是在晚上8点通过。以下是两次单独运行的日志输出:

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,这是一个很好的问题(立即受到欢迎)。谢谢