如何获得全球有效时间戳

时间:2016-04-27 20:46:22

标签: javascript date meteor timestamp

在我的管理面板上,我从日期输入中选择日期并将其发送到服务器,服务器将其存储在MongoDB日期字段中。在发送之前,我用setHour(23,59,59,999)更改日期,以便倒计时在午夜结束(无论什么时区,我都不在乎,只要它在世界上每个人的同一时刻结束)。

然后(我正在使用Meteor),我查询字段,这是一个Date对象,我得到的时间戳为.getTime(),每分钟,感谢setInterval,我只是使用新的Date()计算剩余时间,并输出hh:mm格式。

但是,当我把我的电脑放在不同的时区时,在下一个间隔计算中,剩下的时间值被修改。对于不在同一时区的客户来说也是如此,这意味着剩下的计算时间很可能不是绝对值。

选择日期:

Meteor.call("saveDate", new Date(new Date(t.find("#form_date").value).setHours(23,59,59,999)));

将其保存在mongo,服务器端:

saveDate: date => { DailyTopic.insert({ date: date }); };

客户计算和显示:

getTimeRemaining = function (limit) {
  let endTime = new Date(limit).setHours(23, 59, 59, 999),
      nowTime = Date.now();

  let t = endTime - nowTime;

  let seconds = Math.floor( (t/1000) % 60 ),
      minutes = Math.floor( (t/1000/60) % 60 ),
      hours   = Math.floor( (t/(1000*60*60)) % 24 );

  return ({
    'hours'   : hours,
    'minutes' : minutes,
    'seconds' : seconds
  });
}

Template.debate.onCreated(function () {
  let self = this;

  self.timeLeft = new ReactiveVar(null);

  self.limit = getTodayTopic('fetch');

  self.interval = Meteor.setInterval(function () {
    self.timeLeft.set( getTimeRemaining( getTodayTopic('fetch').date ) );
  }, (1000 * 60));

  setTimeout(function () {
    self.timeLeft.set( getTimeRemaining( getTodayTopic('fetch').date ) );
  }, 3000);

});
 [...]

displayIimeLeft: function () {
    let time = Template.instance().timeLeft.get(),
        sp = " ";

    if (time) {
      return (time.hours + sp + TAPi18n.__('hours') + sp + time.minutes + sp + TAPi18n.__('minutes'));
    }
  }
...

但我的问题是显示的倒计时会根据客户时区而变化,因为我需要它在世界各地都一样!

2 个答案:

答案 0 :(得分:1)

您只需要从服务器创建限制日期的日期对象,因为您标记了Javascript,它将按照以下方式完成:

var time = new Date();

然后,将所需的时间添加到该日期对象,即当前时间。

之后,您可以将日期对象(具有您的服务器时区)与您的客户日期(及其时区)进行比较

使用Moment.js

可以轻松完成
moment(time).fromNow(); // E.g: in 24 Hours.

实际上这可以在没有Moment.js的情况下轻松完成,但它取决于你。 唯一的技巧是将日期与时区进行比较。

答案 1 :(得分:0)

如果您只是倒计时到某个特定时间,您甚至不需要将时间值转换为日期,您可以这样做:

var millisecondsLeft = timeValue - new Date();

就是这样。如果值为负,那么您将超过时间值所代表的时间。

如果您传递了您想要倒计时的UTC时间值,那么在主机系统上,您可以使用new Date(timeValue)创建等效日期。

使用此方法,主机时区仅用于显示输出的人类可读字符串,它对日期的时间值没有影响。如果您使用 toISOString 之类的方法(通常是GMT),那么无论时区设置如何,您都会在所有主机上看到完全相同的时间。

因此,如果您想在2016年5月25日中午对某个特定系统进行倒计时,那么请在该系统上创建一个日期并获取其时间值:

var timeValue = new Date(2016, 4, 25, 12).getTime();

现在可以在任何其他系统上执行:

var date = new Date(timeValue);

并且您将获得完全相同的时刻的日期(提供 timeValue 是一个数字,而不是字符串)。

通过在获取时间值之前简单地将适当的偏移量应用于时间值或日期对象(使用UTC方法),在任何时区中创建时间值也很容易。