首页 专题 财经 查看内容

同一个页面的时间变来变去,啥原理

2022-10-21 11:08| 发布者: 樊华| 查看: 42100| 评论: 0|来自: IT之家   阅读量:6608   

摘要:之所以会这样,是因为我发了一个SpringOne的通知,Spring的官方技术发布会。 请注意大会第一项的时间栏。上面写着: 中部时间晚上9:00—10:00 也就是当天晚上9点正式开始。 但是一个读者的评论...

之所以会这样,是因为我发了一个SpringOne的通知,Spring的官方技术发布会。

同一个页面的时间变来变去,啥原理

请注意大会第一项的时间栏。上面写着:

中部时间晚上9:00—10:00

也就是当天晚上9点正式开始。

但是一个读者的评论让我思考。

我查了一下CST,时区的缩写,可以代表下面这么多时区的缩写:

中部时间:中部标准时间UTC—6:00

澳大利亚中部时间:中部标准时间UTC+9:30

中国标准时间:中国标准时间UTC+8:00

古巴标准时间:古巴标准时间UTC—4:00

我通过分析得出的结论是,如果美国时间晚上8点开始,整个会议大部分都在凌晨进行,不太合理,所以我猜测应该是中国时间,也就是中国标准时间UT+8:00。

我让我的一个美国朋友访问下面的页面,果然,时间和我显示的不一样:

现在是太平洋时间早上6点到7点

PDT代表太平洋夏令时UTC—7:00太平洋夏令时。

我请我的一个英国朋友再来拜访我,得到的答复是:

英国夏令时下午2点至3点

BST代表英国夏令时UTC+1:00。

我请我在德国的一个朋友再次来访,得到的答复是:

CEST下午3点至4点

CEST代表中欧夏令时UTC+2: 00。

什么原则。

然后我想,原理应该是请求头加什么参数来标识我的时区。

但是我抢到包之后,并没有发现类似的参数。

然后我就想,那要根据我的要求IP来判断。

于是我查了一下,发现无论我怎么切换vpn,显示的时间都是CST和中国时间。

正当我一筹莫展的时候,我问一位即将回国的英国朋友。他参观后居然展示了中国时间!

中部时间晚上9:00—10:00

然后他说了一句话,一句惊醒梦中人的话他说他很快就要回中国为了提前适应,他把电脑的时区设置成了中国

原来如此!

我立即将我的时区调整为美国的太平洋时间。

重新打开浏览器,访问SpringOne。

时间终于变成了太平洋时间,证明美国人从早上开始看这个发布会,然后持续了一整天我们中国是晚上开始看,然后要想赶上直播就需要熬夜

也证明了页面显示的时间和我的操作系统设置的时区有关。

追根究底,继续探索。

话说回来,这个网站的H5页面是怎么处理我系统的时间的。

我开始抢包。

首先,这肯定不是静态页面,所以一定是js动作。

在浩如烟海的js包中,我找到了一个名为schedule.js的,负责给这些时间赋值,一看就知道。

注意,getUnixTimestamp方法被广泛用于获取时间。

所以我在另一个js里找到了这个方法的定义,在core.min.js里

这个方法是压缩的,格式化它,然后执行关键信息,如下:

$ tz datetime:$ a . $ tz datetime . eachd . convert datetime)convert datetime:function(b)varc = b . dataset . datetimeoutvarh = moment . tz . guess()varc = b . dataset . datetimeoutgetunixtimestamp:function(b,c)returnmoment.tz(b,c"MM/DD/YYYYHH:mm ","America/New_York ")tz(h)

重点看这个功能。

varh=moment.tz.guess

该功能是与系统设置的时区进行交互的关键它可以检查你的时区,这正是你的系统设置的时区

我将系统时区设置为美国太平洋时区,在浏览器控制台中执行这段js代码后,得到了以下结果:

moment . tz . guess, "美国/洛杉矶 "

我将系统时区设置为中国的北京时间,在浏览器控制台中执行这段js代码后,得到了以下结果:

gt,gt,moment . tz . guess, "亚洲/上海 "

仅此而已这个js函数可以获取我们系统设置的时区,所以自然可以用系统时区动态改变页面上的时间

怎么改就是通过刚才getUnixTimestamp的函数。

getUnixTimestamp:function return moment . tz(b,c"MM/DD/YYYYHH:mm ", "美国/纽约 ")tz(h)

我们知道H代表时区,所以第一行tz是设置一个纽约时间的初始值,第二行tz转换成我们系统设置的时区,第三行valueOf最后可以转换成时间戳。

我们就拿一个数值浏览器控制台来执行这个函数验证一下吧比如我们想看看2021—09—01 08:00纽约时间换算成北京时间是什么结果

力矩 gttz gttz(moment . tz . guess()) gt,

这个1630497600000是时间戳转换工具转换的,它是:

完美这个函数将纽约时间2021—09—01 08:00转换为北京时间2021—09—01 20:00,刚好差1 2个小时没问题

a类结果,转换后的值填充在页面上的标签tz—datetime下。

$ tz datetime:$ a . $ tz datetime . eachd . convert datetime)

是的,那是我们看见它的地方。

至此,这个问题终于得到了完美的解释!

感谢这位读者的提问,感谢世界各地的亲朋好友的支持,让我度过了一个愉快的探索下午,还有这篇随机的文章!

我觉得还是做个技术人好,就是愿意花一个下午的时间去研究学习,只为了解答自己心中的一个疑问,而得出结论后的那种快乐是我独有的。

然后我就有了双喜临门,就是写了一篇文章给大家看,看了大家的留言,赞了。

希望对大家有帮助~

郑重声明:此文内容为本网站转载企业宣传资讯,目的在于传播更多信息,与本站立场无关。仅供读者参考,并请自行核实相关内容。

分享至:
| 收藏

观察家网© 2012-