gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:41:18 36 4
gpt4 key购买 nike

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

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

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

应用程序流程如下:

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

我在第 1 步捕获了时区,并尝试将其传递到所有步骤,但我一定错过了一些东西,因为在 4 到 5 之间时区(似乎)丢失了。速度很快,我不明白为什么。我已经检查了 100 次,并尝试了各种不同的排列,但无法找出差距在哪里(我已经使用了太多 console.log() 了,这太疯狂了。)

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

读到这里,你可能会觉得我没有做足够的测试,但事实并非如此。我在这上面花了 10 个小时,但我就是不明白。我很乐意分享代码,但我认为它太长且太复杂,无法正确分享,因此我已尽力解释问题。

最佳答案

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

打开浏览器控制台并输入 time = new Date() 。注意它是如何处于正确的时区的吗?这是因为时区转换是在客户端上进行的。

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

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

<小时/>

编辑时间模式:

根据新信息,我想您有一些接受 arrivalTime 的东西然后确保时间在 earlyArrival 之间和lateArrival例如,上午 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";
}
}

关于javascript - 在 Meteor 中使用 moment.tz.setDefault() 的范围是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28770151/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com