Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在ms中,前端传递的日期与后端(Java)传递的日期不同_Java_Angularjs_Date_Spring Mvc - Fatal编程技术网

为什么在ms中,前端传递的日期与后端(Java)传递的日期不同

为什么在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

我正在开发一个前端使用AngularJS,后端使用Java(使用Spring)的应用程序。
我注意到前端中的
配置文件
-实体的显示日期与数据库中的日期不同。
因此,我调试了保存日期的时刻,发现在前端(保存日期时正好-
$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”)-现在似乎可以了,一旦我测试了所有东西,我会在答案中写下我是如何做到的。