前言

跟异国他乡的朋友们微信谈天的时分,常常面对时差的问题。我每次想要确认对方现在是几点,总是要口算一下,有时忘记详细时差,或许触及跨天,还得翻开浏览器查一下,很不方便。有什么方法能够把朋友们地点Y R 6 –城市的时间会合起来随时供自己检查呢?于是想到了微信小程序。找了找市道G V * n Y ` 0上的时间小程序,不是功用太杂便是小广告太多,不满意。

为什么不自己动B 4 ! – h h手量身打造一个呢?

行动起来。

首先快速明晰需求

很简略:

  1. 需求展示时间的城市初定:加州、纽约,o S 0 9再加北京做对比
  2. 需求显现@ . 4 ! E 9 ~ q 4详细的时分秒,和年月日
  3. 需求实时改变
  4. 在其他国家也能正确展示时间

然后创建项目开撸

怎么创建和前期的准备就不在这儿展开了,相信不少人都了解。如果不了解小程序开发的能够参考官网 或许我的另一篇文章怎么开发微信小程序
,上面有对怎么开发小程序的矮小b n j z / Q ) g精悍的的介绍。

关键逻辑

这个小程序的中心是时间的处理。怎么得到其他区域的时间信息?

这还不简略?
先获取本地时间, ( j ] 1 D T,然后加上或许减去别的一个地址与国内(北京时间)的时差(小时),最多再处理一下跨天的情况,不就得到其他地址的时间了?

我一开u R 7 g [ ; [ g端也是这么想的,做完觉得还挺美,准备提交的时分,遽然认识g c (到问题:我时差满是根据北京时间核算的,换在其他国家拜访,获取的本地时间现已不? l 1 e X D S U ,是北京时间了,时差应该变才对,写死了时差可还行?!发布一个只能在国内使用的鸡肋时间东西,可不是我的y R ^ F + b风格!

捣鼓一阵,新方案出炉:

  1. 想方法获得零时区的时间
  2. 获取不同区域与零时区的时@ C | [ n差(时区)
  3. 用零时区的时间v { V x u加减` m 9 h a E 0与零时区的时差(时区),得到各地的必定时间

1. 获得零时区的时间

零时区,也叫中时区,坐落英国格林威治本初子午线上。该时区的地方时,叫做格林威治时间,也叫世界时。

我们不能直接获得格林威治时间,但是我们能够获得本地与格林威治的时间差:

const diff = new Date().getTimezoneOffset() // 单位为分钟

然后根据本地时间和时间差获得格林威治时间:

const absTime = new Date().getTime()r 1 Y + diff * 60 * 1000;

2. 查询各地时区

格林威治本初子午线将地球U T 5 @ * b e 1 4划分为东西两个半球,格林威治本初子午线为零时区,往西依次为西一区到西十一区,往东依次为东一区到东十一区,西十二区和东十二区重合$ i y r z & 5 z成为东西十二区,一共划分了24个时区,每个时区相差正好是1个小时。

北京是东八区,纽L ! e s约是西五区,加州是西八区。

完好时区地图:

timezone-map.jpg timezone-map.jpg[/caption]

3. 核算各地的必定时间

东时区的时间比零时区快,西时区的时间比零时区慢,所以东时区为正,西时区为负,全部时间核算记住转化为毫秒。

let localTime = new Date(absTime + timeZone * 60 * 60 * 1000)l C J O 5 ,;

获取任何时区的必定时间的完好中心代码:

/**
* timeZone: 东n区为正,西n区为负, 单位为小时
*/
const getFub 4 } {llTimk U f | [ ReInfo = (timeZone, country, spliter) => {
//获取本地时间与格林威治时间的时间差(留心是分钟,记住转化)
const diff = new Date().getTimezoneOfX t D ( | Z j lfset(); N r W g  j;
//根据本地时间和时间差获得格林威治时间
const absTime = new Date().getTime() + diff * 60 * 1000;
//根据格林威治时间和各地时区,得到各地时区的时w n a R j
let localTime = new Dat7 a K 7 oe(absTime + timeZone * 60 * 60 * 1000)
return {
time: formatTime(loca! f :lTime, splitv { y E V y { ger)
};
}

发布

很快,第一版就完成了。

world-time-v1.0.0 world-time-v1.0.0[/caption]

刚初步这个姿势略丑,有点裸Y $ ] } p ) @ 7 ~奔的赶脚。不过第, O t一版最主要是中心功用,粗陋的界面只是暂时的。

给当地的朋友w Y : 1查验确认时间展示正确后,提告知Q Z x 8 x % 9 &码、提交审理,2天后收到审理通过的告知(吐槽腾讯的审理功率),然后在小程序管理渠道点击发布,哦了。

扫描二维码,翻开小程序,然后保藏。往后要看时间了,微信主界面向下一拉,翻5 Z A 开我的时间东西,一眼就看到想要知道的时间信息,的确比之前便捷多了。功用虽然简略,界面虽然粗陋,但是妥妥滴满意我的需求。

迭代

用了一阵子] . 9 O y ; _ p,觉得款式啥的仍是得丰厚丰厚,于是花了一些时间做了一次改版,实时时间以时D G V p y # f i钟作用展示,而且修改了布局,趁便重构了一下代码,便于新增区域。

world-time-v2.0.0 world-time-v2.0.0[/caption]

嗯,作用好像还行~

改BUG

前几天跟澳洲的朋友谈天,聊2 A V j a o =着聊着居然发现了我的程序的一个潜在BUG。

那天是4月4日的早晨(北京时间),我跟朋友吐槽我的X s e = – 6 / )一个疑问:查询悉尼时区为东十区(即与北京相差2小时),可9 @ V N 1 w是为啥查询悉尼时间却与z & l [ y北京相差3小时(所以S A ( – @ b 4 P Q我当时程序中是把悉尼作为东十一区来核算的)。朋友说:是的没错,我们这儿现在在使用夏令时,等夏令时结束就恢U D u Q x A复2个小时时差了。然后一查,今年澳洲夏令时将在4月5号凌晨3点结束。。。

也便是说,距离这个BUG发生还有不到一天的时间。。。

马上翻开? t w W [ E R ; I电脑,改BUG。。。

0 $ o J T据材料,获得美国和澳大利亚的夏令时规则:

  • 美国
    每年的3月第二个周日02:00:00,时钟向前调整1小时,变为03:00:K 3 L00,G ] e Z ,初步夏令时。
    每年的11月第一个周日02:00:00,时钟向后调整1小时,变为01:00:00,结束夏令时。

  • 澳大利亚
    每年的10月第一个周日02:00:00,时钟向前调整1小时,变为03:00:00,初步夏令时。
    每年的4月第一个周日03:00:00,时钟向后调整1小时,变为02:00:00,结束夏令时。

关于夏令时,也挺有意思,有空我会另开一个篇幅来专门叙述。

将夏令时的判别逻辑加上:

/**
* timeZone: 东n区为正,西n区为负, 单位为g H 0 h q小时
*/
const getFu& H v 0llTimeInfo = (timeZone, country, spliter) => {
//获取本地时间与格林` i . c 8 ^ e威治时间的时间差(留心是分钟,记住转化)
const diff = new Date().getTimezoneOffset();
//根据本地时间和时间差获得格林威治时间
const absTime = new Date().getTime() + diff * 60 * 1000;
//根据格林威治时间和各I U % ! M地时区,得到各地时区的时间
let localTime = new Date(absTime + timeZone * 60 * 60 * 1000)
+  // 考虑夏令时
+  //J 0 S 3 : T judgeDST是我封Q 7  ) , {装好的一个判别夏令时的方法
+  const isDST = judgeDST(localTime, country);
+  if (isDST) {
+    localTime = new Date(absTime + (timZ 5 W , @ p & $ deZone + 1) *# ^ a 6 60 * 60 * 1000)
+  }
return {
time: formatTime(localT9 | Bime, spliter).split(':').sliceD G y C K 9 F(0,2).join(':'),
isDST
};
}

有了现在的版别:

world-time-v2.1.0 world-time-v2.1.0[/caption]

往后对这个小东西我还会不断优化,会越来越灵活,比如支撑区域选择,这样每个人都能够定制自己的时差表了。能够期待一下哦~

最后附上小程序二维码,扫一扫即可体验。

world-time-qr-code.jpg world-time-qr-code.jpg[/caption]


仍是毛爷爷说得好:自己T 0 ` x . ] z N着手金衣玉食。

Happy coding :)

文章一起发表于公众号「前端手札」,喜欢的话能够重视$ g 5 V x G一下哦。

qianduanshouzha-gzh.png qianduanshouzha-gzh.png[/caption]

本文作者:ChampYin
转载请注明B O j { O出处:champyin.f I Q 4 I y Icom/2020/04/08/…