我正在使用前端的AngularJS和后端的Java(带有Spring)开发应用程序。
我注意到profile
前端显示的-entity 日期与数据库中显示的日期不同。
因此,我调试了保存日期的时间,发现在前端(保存日期的正确时间- $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()”函数不依赖于时区,所以不应该在前端和后端都返回相同的数字吗?
问题是,即使前端中显示的日期是11月1日,当我将值导出到Word文件并显示它写“ October”的月份时。
有谁知道我可以做什么?
这是传递的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端),您的(格式化)日期是'星期二10月31日23:00 :00 CET 2017'。
请注意,这两个日期表示相隔一个小时(或2,具体取决于DST)的时刻。日期和时间部分是等效的,但JavaScript日期以UTC表示,而Java日期显示CET时区。由于CET取决于DST是UTC + 1还是UTC + 2,因此它们并不相同。
看起来Java方面的事情是采用UTC格式的日期字符串,忽略时区,然后将其按原样反序列化为具有本地(CET)时区的Java Date。
在将后端插入数据库然后再次检索之后,在后端查看日期,这为错误的位置留下了很多可能性。在将其反序列化之后,您必须立即在Spring Controller中对其进行检查,然后在进入数据库的每个步骤中再次进行检查,以查看错误的转换在哪里。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句