为什么在ms中,前端传递的日期与后端(Java)传递的日期不同
我正在开发一个前端使用AngularJS,后端使用Java(使用Spring)的应用程序。为什么在ms中,前端传递的日期与后端(Java)传递的日期不同,java,angularjs,date,spring-mvc,Java,Angularjs,Date,Spring Mvc,我正在开发一个前端使用AngularJS,后端使用Java(使用Spring)的应用程序。 我注意到前端中的配置文件-实体的显示日期与数据库中的日期不同。 因此,我调试了保存日期的时刻,发现在前端(保存日期时正好-$scope.selectedProfile.$save)中,日期具有以下值: $scope.selectedProfile.projects[1].start -> Date: 2017-10-31T23:00:00.000Z $scope.selectedProfile.pr
我注意到前端中的
配置文件
-实体的显示日期与数据库中的日期不同。因此,我调试了保存日期的时刻,发现在前端(保存日期时正好-
$scope.selectedProfile.$save
)中,日期具有以下值:
$scope.selectedProfile.projects[1].start -> Date: 2017-10-31T23:00:00.000Z
$scope.selectedProfile.projects[1].start.getTime() -> 1509490800000
接下来,我到达后端返回行的断点:
@RestController
@RequestMapping(value = "/profiles", produces = MediaType.APPLICATION_JSON_VALUE)
public class ProfileController {
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public Profile update(@RequestBody Profile profile) {
return this.repository.save(profile);
}
}
并且该日期具有以下值:
profile.projects.get(1).start -> (Date) “Tue Oct 31 23:00:00 CET 2017”
profile.projects.get(1).start.getTime() -> 1509487200000
问题不是已经出现了吗因为“getTime()”函数不依赖于时区,所以不应该在前端和后端返回相同的数字吗
问题是当我将值导出到Word文件中并显示它写入“十月”的月份时,即使前端显示的日期是11月1日
有人知道我能做什么吗
下面是传递的JSON:
{
"id": 64,
"projects": [
{
"id": 135,
"project": 339,
"start": null,
"end": null
},
{
"id": 132,
"project": 403,
"start": "2017-10-31T23:00:00.000Z",
"end": null
}
]
}
数据通过以下代码传递:
$http.post('/profiles/profiles', profile)
映射是由Spring自动完成的。我认为您对日期的理解有误(在JavaScript和Java中) 取决于时区,我认为在Java端解析入站日期的方式可能有问题 在客户端(JavaScript端),您的(格式化)日期是“2017-10-31T23:00:00.000Z” 在后端(Java端),您的(格式化)日期是“2017年10月31日星期二23:00:00 CET” 请注意,这两个日期表示相隔一小时(或2小时,取决于DST)的时间。日期和时间部分是等效的,但是JavaScript日期是UTC,而Java日期显示CET时区。由于CET是UTC+1或UTC+2,取决于DST,因此它们不相同 看起来Java端的某些东西采用UTC格式的日期字符串,忽略时区,并将其按原样反序列化为Java日期和本地(CET)时区
在将日期插入数据库并再次检索之后,查看后端上的日期,可以发现很多可能的错误所在。您必须在反序列化后立即在Spring控制器中对其进行检查,然后在通往数据库的每一步中再次返回,以查看错误转换的位置。尝试格式化日期哪里是将日期从fontend发送到后端的代码?您发送的JSON包含什么?@JBNizet thx对于提示,我添加了infoSo,所以问题出在后端。如何解析JSON?看起来您仍然在使用过时的、糟糕的java.util.Date类。不要。使用java.time.Instant.@JBNizet-thx作为提示-我会在取得任何进展后尝试更新此帖子。我找到了一个解决方案:当我在java模型中的日期类型属性上方添加此注释时,序列化是正确的:
@JsonFormat(shape=JsonFormat.shape.STRING,pattern=“yyyy-MM-dd'T'HH:MM:ss.SSS'Z”,timezone=“UTC”)
但我不想将此注释添加到每个变量中。必须有一种方法来设置这个全局(?)@Cold_类如果您使用Jackon,您可以在ObjectMapper上定义一个默认的日期格式化程序。从Jackson的v2.9开始,您就有了处理ISO日期的标准格式。尝试objectMapper.setDateFormat(新的StdDateFormat().withColonInTimeZone(true))
@StanislasKlukowski thx,我想我找到了-我在编码中找到了一个现有的映射器,并添加了mapper.setTimeZone(TimeZone.getTimeZone(“UTC”)代码>-现在似乎可以了,一旦我测试了所有东西,我会在答案中写下我是如何做到的。