开发和生产环境之间的奇怪日期错误

Posted

技术标签:

【中文标题】开发和生产环境之间的奇怪日期错误【英文标题】:Strange date error between Development and Production environment 【发布时间】:2020-06-01 09:42:15 【问题描述】:

我有一个奇怪的日期错误,我几天都无法解决并请求您的帮助。

我已经用 Java/Spring/Vaadin/Hibernate 开发了一个应用程序,该应用程序可以每天为用户创建运动训练。 问题是培训日期在浏览器中显示不正确。 例如,我现在创建一个新的培训:

training.setTrainingdate(LocalDate.now());

在本地主机上显示正确,但从亚马逊 AWS Tomcat 在线显示日期错误(前一天)。 mysql 数据库在这两种情况下都很常见 = Amazon RDS Mysql。 我的时区是 UTC +1(欧洲/维也纳)

2020-02-17

但是当我从 aws 获得训练时在浏览器中显示

2020-02-16

我已经检查过的内容:

- 在 AWS-RDS-MySQL 服务器上:

SELECT now();

2020-02-17 12:55:50

SELECT * FROM `mydatabase`.training;

2020-02-17

- SSH 上的 Elastic Beanstalk:

date

2020 年 2 月 17 日星期一 11:55:50 UTC

日志文件 /var/log/tomcat8/catalina.out /var/log/tomcat8/httpd/access_log /var/log/tomcat8/httpd/error_log

2020-02-17 11:55:50.985

无论什么时候我都尝试不同的一天。

不同的设备和不同的浏览器同样的问题。

你有一个想法吗? 非常感谢!

编辑:

TimeZone.getDefault())

在生产服务器上:

sun.util.calendar.ZoneInfo[id="Universal",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]

在本地主机上:

sun.util.calendar.ZoneInfo[id="Europe/Berlin",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=143,lastRule=java.util.SimpleTimeZone[id=Europe/Berlin,offset =3600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay= -1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]]

【问题讨论】:

“但是在浏览器中当我从 aws 获得训练时显示” - 是通过 javascript 解析的日期字符串吗?比如说new Date() 或其他什么,或者它是来自响应的原始字符串? 需要注意的一点是开发和生产是否有不同的服务器时区,即每个环境中TimeZone.getDefault() 的输出。 从您提供的内容中很难猜到。但我要确保,日期正确存储在数据库中(它在内部通常映射到 long),并且在映射到 long 和返回时时区必须正确。我认为您可以在连接字符串中(在数据源配置中)添加一个默认时区,否则 MySQL 会选择一个。无论如何,对我来说,听起来您的代码以某种方式使用服务器本地时区。 您的 AWS 服务器位于何处? (哪个国家) @kscherrer 美国东部(弗吉尼亚北部)us-east-1 【参考方案1】:

已解决

解决方案:

我为maven mysql-connector-java 依赖添加了一个版本:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.48</version>
</dependency>

我添加到 spring applications.properties:

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

并在 spring.datasource.url 的尾部添加/更改为:

?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false

PS 非常感谢所有试图提供帮助的人!特别感谢@Leif Åstrand 和@PeMa

【讨论】:

以上是关于开发和生产环境之间的奇怪日期错误的主要内容,如果未能解决你的问题,请参考以下文章

SAP各个集团还有开发机测试机生产机之间啥关联关系?

区分开发、登台和生产环境之间的 web.config

asp.net生产环境和开发环境的错误日志包装策略

开发环境生产环境测试环境的基本理解与区别

thinkphp 3.2.3 搬家到另一个电脑环境 ,环境一致但报错,系统发生错误

什么是 开发环境测试环境生产环境UAT环境仿真环境