我面临以下问题,我有一个带有 Angular 和 Java 的 Play 应用程序。在一个页面中,客户端在日历中选择某个日期和时间,例如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 () {
});
}
这是在我的服务器端接收请求的 Controller 上。当请求到达服务器时,如果我检查 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
类使用的任何对象结构。 - 如果该对象也采用本地时间行为,它将使用服务器的本地时区。
因此,您要么通过将本地值与 UTC 值进行比较,要么通过将本地时间值与另一个时区的本地时间进行比较来看到时差。
很难就您应该做什么提供更准确的建议,因为您没有显示代码的重要部分。我们需要查看 Date 对象的原始分配、序列化代码、通过线路发送的字符串值、反序列化代码以及被反序列化的类结构。我们还需要一些上下文来了解您的用户选择的是特定通用时刻的日期和时间,还是特定时区的本地日期和时间,或者只是日历日期,或者是什么。上下文是关键,但您没有提供太多内容。
关于java - 服务器端更改客户端发送的日期/时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30147696/