客户端发送的服务器端更改 date/time

Server side changes date/time sent by client

我面临以下问题,我有一个带有 angular 和 java 的播放应用程序。在一页中,客户在日历中选择某个日期和时间,例如 2015-04-03 15:00 此数据作为日期放入 JavaScript 对象中后来这个数据提交到我的服务器,但似乎服务器正在将这个 date/time 转换为他的时区保存 2015-04-03 16:00 而不是 15:00作为客户端发送。

在我将数据提交到服务器后,当我重新加载页面时,数据持久保存在数据库中,显示日期少了 1 小时

正在向服务器发送数据。请注意,有一个 console.info() 打印日期时间。它正在打印正确的 date/time。用户选择的date/time。

$scope.confirmCallback = function () {
                $scope.schedule.client = $scope.client;
                $scope.schedule.type = 'CONTACT';
                console.info($scope.schedule.date); //PRINTS OK DATE/TIME
                ScheduleRepository.create($scope.schedule).then(function () {
                    Alert.success('views.schedule.message.successSaved');
                    $scope.schedule = {};
                    $scope.tableSchedules.reload();
                }, function () {

                });
            }

这是我服务器端接收请求的控制器。如果我检查 json 请求到达服务器的那一刻,我可以看到日期时间值与我发送的不同。我想这与客户端和服务器端的时区有关。

@Dynamic("CREATE_SCHEDULE, EDIT_SCHEDULE")
public static Result save() {
    try {
        JsonNode request = request().body().asJson();//SHOWS DIFFERENT DATE/TIME
        ScheduleClient scheduleClient = JSONUtils.fromJson(request, ScheduleClient.class);

有什么解决这个问题的建议吗?提前致谢

需要了解的几件事:

  • Date 对象不能 通过网络发送。必须序列化.
  • JSON 没有本机日期序列化格式,但最佳实践惯例是发送 ISO-8601 / RFC3339 序列化字符串。
  • JS Date 对象采用它所在的时区 运行。因此,如果您对其调用 toISOString(或者如果您的 ScheduleRepository 调用),它将使用该时区转换为 UTC。
  • 在接收端,您的 JSONUtils.fromJson 调用会将字符串值反序列化回您的 ScheduleClient class 使用的任何对象结构。
  • 如果该对象也采用本地时间行为,它将使用 服务器 的本地时区。

因此,由于将本地值与 UTC 值进行比较,或者通过将本地时间值与另一个时区的本地时间进行比较,您会看到时差。

很难就您应该做什么给出更准确的建议,因为您没有显示代码的重要部分。我们需要查看 Date 对象的原始分配、序列化代码、通过线路发送的字符串值、反序列化代码以及反序列化后的 class 结构。我们还需要一些 context 来了解您的用户是在特定的通用时刻选择日期和时间,还是选择特定的本地时区日期和时间,或者只是一个日历日期,或什么。上下文是关键,您没有提供太多内容。