在Meteor中使用moment.tz.setDefault()时的作用域是什么

What is the scope of moment.tz.setDefault() when used in Meteor?

本文关键字:是什么 作用域 setDefault tz Meteor moment      更新时间:2024-06-18

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

我确信我的问题源于我对JavaScript和Meteor都缺乏经验,但我已经连续几天在这个问题上挣扎了。

我正在开发一款必须考虑客户端时区的应用程序,但我在强制服务器代码使用客户端时区方面遇到了很大困难。在这一过程中的某个地方——从客户端按下"提交"到Meteor插入的那一刻——我的时区设置正在丢失,(服务器的)本地时间正在使用。

应用程序流程如下:

  1. (客户端)用户提交表单
  2. 执行(客户端)数据验证
  3. (服务器)Meteor方法被调用
  4. 执行数据的(服务器)验证(与前面的代码相同)
  5. 应用(服务器)业务逻辑
  6. (服务器)插入数据库

我在第1步捕获了时区,尝试将其通过所有步骤,但我一定错过了什么,因为在4到5之间,时区(似乎)丢失了。速度是,我不明白为什么。我已经检查了100次,尝试了各种不同的排列,但都不知道差距在哪里(我用了太多console.log(),太疯狂了。)

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

读到这篇文章,听起来可能我没有做足够的测试,但事实并非如此。我已经花了10个小时在这上面了,但我只是不明白。我很想分享代码,但我认为它太长太复杂了,无法正确分享,所以我已经尽力解释了这个问题。

好消息!你把它搞得太复杂了:-)

打开浏览器控制台&类型CCD_ 5。注意到它在正确的时区吗?这是因为时区转换发生在客户端上。

现在,键入time.valueOf()。正如你可能知道的,你已经得到了自1970年1月1日以来的毫秒数……但在哪个时区??你猜对了,UTC!

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


编辑时间模式:

根据新的信息,我想你有一个接受arrivalTime&然后确保时间在earlyArrivallateArrival之间,例如上午7:00-8:30。因此,将时间保存为日期

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";
    }
  }