我正在创建一个事件的倒计时,服务器给我这个事件留下的秒数。它在美国/纽约的同一时区工作正常,但我不知道如何在不同的时区实现这一目标。我想我必须根据用户的时区添加/减去几秒钟。我考虑到服务器返回的秒数总是在EST中。有人可以提供建议吗?到目前为止,我有这个,但我收到一个错误:
let serverZoneTime = new moment().tz.zone("America/New_York").offset(now);
let currentZoneTime = moment.tz.guess().offset(now);
console.log((EstTzOffset - currentTz));
首先,如果这是某一天下午6点的事件,我会得到该事件开始时间的确切时间戳或UTC时间。下面我使用的是假时间戳。
这很重要,因为观看您的活动的人可以在“现在”(您在上面使用)和活动当天下午6点之间从EST变为DST。
听起来你已经有了倒计时工作,但这只是你正在处理的时区问题,所以我将跳过倒计时逻辑。
const moment = require('moment-timezone');
// Get User's Timezone
const userTimezone = moment.tz.guess(); // this has to be on the client not server
const serverTimezone = "America/New_York";
// Get the exact timestamp of the event date apply the server timezone to it.
const serverEventTime = moment(34534534534, 'x').tz(serverTimezone);
// Take the server time and convert it to the users time
const userEventTime = serverEventTime.clone().tz(userTimezone);
// From here you can format the time however you want
const formattedUserEventTime = userEventTime.format('YYYY-MM-DD HH:mm:ss');
// Or format to a timestamp
const userEventTimestamp = userEventTime.format('x');
对于倒计时,你现在也想要时间,这遵循与上面相同的逻辑:
const serverTimeNow = moment().tz(serverTimezone);
const userTimeNow = serverTimeNow.clone().tz(userTimezone);
// Get timestamp so we can do easier math with the time
const userNowTimestamp = userTimeNow.format('x');
现在我们所要做的就是从事件时间中减去现在的时间来获得差异,然后使用setInterval()重复每秒。
const millisecondsToEvent = userEventTimestamp - userNowtimestamp;
const secondsToEvent = millisecondsToEvent / 1000;
希望这对某人有用(只是意识到这已经有两年了)。