在Meteor中使用时,moment.tz.setDefault()的范围是什么?

时间:2015-02-27 16:50:03

标签: javascript datetime meteor timezone momentjs

TL; DR moment.tz.setDefault()的范围是什么?

我确定我的问题源于我对JavaScript和Meteor的经验不足,但我现在已经连续几天一直在努力解决这个问题。

我正在开发一款必须考虑客户端时区的应用,但我在强制服务器代码使用客户端的时区方面遇到了很大的困难。在某个地方 - 从客户按下的那一刻开始#34;提交"到目前为止Meteor插入 - 我的时区设置正在丢失,并且正在使用(服务器的)本地时间。

应用流程如下:

  1. (客户端)用户提交表单
  2. (客户端)执行数据验证
  3. (服务器)称为流星方法
  4. (服务器)执行数据验证(与之前的代码相同)
  5. (服务器)业务逻辑应用
  6. (服务器)插入DB
  7. 我在第1步捕获时区,然后尝试将其传递给所有步骤,但我必须遗漏一些东西,因为在4到5之间,时区(似乎)丢失了。快,是,我没有看到原因。我已经检查了100次,并尝试了各种不同的排列,但无法弄清楚差距在哪里(我已经使用过很多console.log()它疯了。 )

    因此,我没有尝试在每个点Moment()设置时区(因为它默认以当地时间计算),而是发现moment.tz.setDefault()并尝试在每个.js文件上至少使用一次在我的应用程序中但它没有用。

    读到这个可能听起来我没有做足够的测试,但事实并非如此。我已花了10个小时的时间在这上面,我只是没有得到它。我很乐意分享这些代码,但我认为分享代码的时间太长而且太复杂,所以我已尽力解释这个问题。

1 个答案:

答案 0 :(得分:1)

好消息!你过度复杂了: - )

打开浏览器控制台&输入time = new Date()。注意它是如何在正确的时区?那是因为时区转换发生在客户端上。

现在,输入time.valueOf()。你可能知道,自从1-1-1970以来你已经得到了毫秒数...但是在什么时区?你猜对了,UTC!

因此,如果您所做的只是保存一个号码,并且客户端完全能够将该号码转换为本地时区,为什么不在服务器上节省UTC时间?您将在数据库中获得一个ISODate()(这是一个花哨的int64)。然后,当您在客户端上检索它时,您可以将其放在当地时间(他们可能正在旅行!)或您选择的任何其他时区。如果它是某个城市的聚会,那么只需抓住那个城市的时区即可。将它应用到现场。提示:这是使用moment.js的合适时间,而不是之前!


编辑时间模式:

根据新信息,我想你有一些接受arrivalTime&然后确保时间介于earlyArrivallateArrival之间,即7:00 - 8:30 AM。因此,将时间保存为日期

timeToDate = function(time) {
  return new Date('1970 1 1 ' + time);
};
earlyArrival = timeToDate('7:30 AM');
arrivalTime = timeToDate('8:00 AM');
lateArrival = timeToDate('8:30 AM');

然后,通过简单的数学验证:earlyArrival < arrivalTime

或者,如果您使用简单架构(您应该使用),验证模式可能如下所示:

departureTime: {
  type: Date,
  min: timeToDate('5:00 PM'),
  max: timeToDate('6:30 PM'),
  autoValue: function() {
    return timeToDate(this.value);
  },
  custom: function () {
    if (this.value < this.field('arrivalTime').value) {
      return "lateAfterEarly";
    }
  }