我花了很多时间试图了解时区。但我仍然感到困惑。
设计
1)服务器位于与客户端不同的时区。
2)我在API调用中获得了以下信息:
/ API /配置/ V1 /系统/时间
{
"timeZoneOffset": -18000000, (milli sec)
"serverTimeUTC": 1485332569157,
"serverTime": "Wed Jan 25 03:22:49 EST 2017",
"timeZone": "Eastern Standard Time"
}
3)我无权访问服务器。 (不能真正改变那里的任何代码!)
4)我在客户端有完整的访问权限。 (JavaScript)的
问题/需求:
我的代码:
我尝试了以下但仍然困惑于我要去的地方:
getServerTimeZone: function(newTime){
var _this = this;
$.ajax({
url: '/api/config/v1/system/time'
})
.done(function(data) {
if(!newTime){
newTime = new Date();
}
//Get Server Timezone and offset
//Offset is in milli sec. Converting it to hours
var serverTimeOffset = data.timeZoneOffset / (60 * 60 * 1000);
// Get current timezone offset for host device
var x = new Date();
var clientCurrentTimeZoneOffsetInHours = x.getTimezoneOffset() / 60;
//Calculate the difference
var actualOffset = Math.abs(clientCurrentTimeZoneOffsetInHours - serverTimeOffset);
//Format actual time in relative to server time
serverTime = moment.utc(newTime).zone(actualOffset).format('MM/DD/YYYY h:mm A');
});
},
答案 0 :(得分:1)
请参阅下面修改后的代码,我使用了时刻js操作功能utcOffset,以便我们可以更改客户日期的时区。
它将根据客户端上的日期/时间向我们提供相应的服务器日期/时间。
getServerTimeZone:function(newTime){
var _this = this;
$.ajax({
url: '/api/config/v1/system/time'
})
.done(function(data) {
if(!newTime){
newTime = new Date();
}
//Get Server Timezone and offset
//Offset is in milli sec. Converting it to hours
var serverTimeOffset = data.timeZoneOffset / (60 * 60 * 1000);
// Get current timezone offset for host device
var x = new Date();
var clientCurrentTimeZoneOffsetInHours = x.getTimezoneOffset() / 60;
// change the timezone using utcOffset
serverTime = moment(x).utcOffset(serverTimeOffset).format('MM/DD/YYYY h:mm A');
});
},
你可以在这里测试,我使用-5偏移。
答案 1 :(得分:0)
如果我正确理解了要求,则您不应该将任何时区特定信息发送到服务器。当日期/时间以ISO8601格式给出(并且末尾有x)时,它是UTC格式。此时的时区是无关紧要的,仅用于显示目的。
时刻会自动在用户正确的时区显示该日期/时间(基于浏览器设置)。
var d = moment('2016-01-01T00:00:00.000Z');
console.log(d.format('llll')); //This will output the date/time relative to the user's timezone automatically
var sendToServer = d.toISOString() //send this string up to the server. It is in UTC format.