【问题标题】:Use moment and moment-timezone to calculate seconds remaining till an event使用 moment 和 moment-timezone 计算距离事件剩余的秒数
【发布时间】:2016-10-18 04:26:25
【问题描述】:

我正在为一个事件创建倒计时,服务器会告诉我距离该事件还剩多少秒。它在同一时区 America/New_York 工作正常,但我不确定如何在不同的时区实现这一目标。我想我必须根据用户的时区添加/减去几秒钟。我考虑到服务器返回的秒数将始终在 EST 中。有人可以建议吗? 到目前为止,我有这个,但我收到一个错误:

let serverZoneTime = new moment().tz.zone("America/New_York").offset(now); 
let currentZoneTime = moment.tz.guess().offset(now);

console.log((EstTzOffset - currentTz));

【问题讨论】:

  • 如果是倒计时,那么我认为您不需要在这里考虑时区,因为您已经说过“server gives me the number of seconds left till this event 。如果您的服务器说“航天飞机发射还剩 10 分钟”,它将是对伦敦或东京的某个人来说,对你或加那利群岛上可怜的查理来说都是如此。只要让服务器返回绝对滴答声,就会很好
  • @Novice 对不起,你是绝对正确的。实际上柜台很好,我搞砸了我的问题。我需要根据事件在下午 6 点开始的剩余秒数显示一条消息。那么如何在他们的时区中添加/减去秒数以始终显示下午 6 点?
  • 是的,您想获得用户时钟相对于您自己的时钟的偏移量,但您不知道如果您能获得他的时区,他的时区看起来是一个简单的问题,但事实并非如此!问题是由于 DST,时区偏移量在一年中不是恒定的。我建议不要进行手动计算,让 moment.js 这样做看看this 帖子它非常详细地描述了事情并且还提供了一个简单而有效的解决方案
  • @novice 谢谢你的帮助,我会关注这个帖子,看来是我需要的。

标签: javascript momentjs


【解决方案1】:

首先,如果这是某天下午 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');

现在我们要做的就是从事件时间中减去 now 时间来获得差异,并可能使用 setInterval() 每秒重复一次。

const millisecondsToEvent = userEventTimestamp - userNowtimestamp;
const secondsToEvent = millisecondsToEvent / 1000;

希望这对某人有用(刚刚意识到这是两年前的事)。

【讨论】:

    猜你喜欢
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 2019-11-11
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多