开发和生产环境之间的奇怪日期错误
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
日志文件 /var/log/tomcat8/catalina.out /var/log/tomcat8/httpd/access_log /var/log/tomcat8/httpd/error_log2020 年 2 月 17 日星期一 11:55:50 UTC
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
【讨论】:
以上是关于开发和生产环境之间的奇怪日期错误的主要内容,如果未能解决你的问题,请参考以下文章