TL; DR moment.tz.setDefault()
的范围是什么?
我确定我的问题源于我对JavaScript和Meteor的经验不足,但我现在已经连续几天一直在努力解决这个问题。
我正在开发一款必须考虑客户端时区的应用,但我在强制服务器代码使用客户端的时区方面遇到了很大的困难。在某个地方 - 从客户按下的那一刻开始#34;提交"到目前为止Meteor插入 - 我的时区设置正在丢失,并且正在使用(服务器的)本地时间。
应用流程如下:
我在第1步捕获时区,然后尝试将其传递给所有步骤,但我必须遗漏一些东西,因为在4到5之间,时区(似乎)丢失了。快,是,我没有看到原因。我已经检查了100次,并尝试了各种不同的排列,但无法弄清楚差距在哪里(我已经使用过很多console.log()
它疯了。 )
因此,我没有尝试在每个点Moment()
设置时区(因为它默认以当地时间计算),而是发现moment.tz.setDefault()
并尝试在每个.js文件上至少使用一次在我的应用程序中但它没有用。
读到这个可能听起来我没有做足够的测试,但事实并非如此。我已花了10个小时的时间在这上面,我只是没有得到它。我很乐意分享这些代码,但我认为分享代码的时间太长而且太复杂,所以我已尽力解释这个问题。
答案 0 :(得分:1)
打开浏览器控制台&输入time = new Date()
。注意它是如何在正确的时区?那是因为时区转换发生在客户端上。
现在,输入time.valueOf()
。你可能知道,自从1-1-1970以来你已经得到了毫秒数...但是在什么时区?你猜对了,UTC!
因此,如果您所做的只是保存一个号码,并且客户端完全能够将该号码转换为本地时区,为什么不在服务器上节省UTC时间?您将在数据库中获得一个ISODate()(这是一个花哨的int64)。然后,当您在客户端上检索它时,您可以将其放在当地时间(他们可能正在旅行!)或您选择的任何其他时区。如果它是某个城市的聚会,那么只需抓住那个城市的时区即可。将它应用到现场。提示:这是使用moment.js的合适时间,而不是之前!
编辑时间模式:
根据新信息,我想你有一些接受arrivalTime
&然后确保时间介于earlyArrival
和lateArrival
之间,即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";
}
}