服务器端更改客户端发送的日期/时间

时间:2015-05-10 04:22:58

标签: java javascript angularjs playframework timezone

我面临以下问题,我有一个带角度和java的播放应用程序。在一个页面中,客户在日历中选择一些日期和时间,例如 2015-04-03 15:00 此数据作为日期放入javascript对象中,稍后此数据将提交给我的服务器但它接缝服务器正在将此日期/时间转换为他的时区,节省了2015-04-03 16:00 ,而不是 15:00 ,因为客户端已发送。

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

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

$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);

有任何建议如何解决这个问题?提前致谢

1 个答案:

答案 0 :(得分:1)

要实现的一些事情:

  • 无法通过网络发送Date对象 。它必须序列化
  • JSON没有原生日期序列化格式,但最佳惯例约定是发送ISO-8601 / RFC3339序列化字符串。
  • JS Date对象具有运行位置的时区。因此,如果您在其上调用toISOString(或者您的ScheduleRepository会这样做),则会使用该时区将其转换为UTC。
  • 在接收端,您的JSONUtils.fromJson调用会将字符串值反序列化为您的ScheduleClient类使用的任何对象结构。
  • 如果该对象还具有本地时间行为,则它将使用服务器的本地时区

因此,您要么看到时间差异,要么将本地值与UTC值进行比较,要么将当地时间值与另一个时区的当地时间进行比较。

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