我面临以下问题,我有一个带有Angular和Java的Play应用程序。在一个页面中,客户端在日历中选择一些日期和时间,例如 2015-04-03 15:00 此数据将其放在JavaScript对象中,以作为日期,然后将此数据提交给我的服务器但是,似乎服务器将此日期/时间转换为他的时区保存2015-04-03 16:00 而不是 15:00 作为客户端发送。p>在我重新加载页面时,将数据提交到数据库中的服务器后,该页面显示日期少1小时
将数据发送到服务器。请注意,有一个打印日期时间的控制台。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);
有什么建议如何解决这个问题?预先感谢
要实现的几件事:
-
Date
对象无法通过电线发送。它必须序列化。 - JSON没有本机序列化格式,但最好的实践惯例是发送ISO-8601/RFC3339序列化字符串。
- JS
Date
对象在其运行位置的时区域。因此,如果您在其上调用toISOString
(或者您的ScheduleRepository
确实),则使用该时区将其转换为UTC。 - 在接收端,您的
JSONUtils.fromJson
调用将字符串值恢复到ScheduleClient
类使用的任何对象结构。 - 如果该对象也采用了本地时间行为,它将使用 server的本地时区。
因此,您要么看到将本地值与UTC值进行比较,要么通过将局部时间值与另一个时区域的本地时间进行比较。
很难就您应该做的事情提供更多确切的建议,因为您没有显示代码的重要部分。我们需要查看Date
对象的原始分配,序列化代码,通过电线发送的字符串值,进行序列化代码以及被估算中的类结构。我们还需要一些上下文才能了解您的用户是在特定的通用瞬间选择日期和时间,还是特定的本地by-their-their-theirzone日期和时间,还是只是日历日期,或者是什么。上下文是关键,您没有提供太多要进行的。