如何确定 Google 日历侧边栏小工具中的当前周

How to determine the current week in a Google Calendar sidebar gadget

我正在写一个 Google Calendar sidebar gadget 来跟踪每个事件标签的总小时数(根据事件的详细信息确定,即 "tags: work")。

用户可以更改他们在日历中查看的当前周、月、日,我希望能够计算与他们当前视图相关的小时数。

我在 gadget API(或任何其他 Google 日历 API)中没有看到允许小工具访问当前显示视图的任何地方。我注意到 URL 有一个看起来像

的锚标记

g|week-2+23127+23137+23131

对应于 2015 年 2 月 23 日星期一至 2015 年 3 月 1 日星期日以周模式查看。

我还注意到以下关系:

如果有一种方法可以使用 API 获取当前显示的视图,那将是理想的,但我会满足于解析锚标记。不幸的是,我无法破译这些数字是如何工作的。

Google API

可以使用以下call访问当前显示的日期范围:

google.calendar.subscribeToDates(function(d) { // do something });

其中 d 是 Google date range d.startTime 并且 d.endTime 是开始和结束。

数字

URL中的数字不直接对应纪元日期和时间。相反,每年有 512 天与之相关,每个月有 32 天。例如,二月有规律地有 28 天,但每个闰年有 29 天。日历永远不必为此进行调整,因为它只是每个月分配 32 天,并且每次都得出一个漂亮的偶数。

仔细检查显示的日期范围还会发现,如果从 1 月 1 日减去 12 月 31 日的数字,您将得到 130。计算开始和结束(不计算 12 月 31 日和 1 月 1 日) ) 会给你 128。

12 * 32 + 128 = 512 -- 一年12个月,一个月32天,一年128天

此外,由于某种原因,1970 年 1 月 1 日的相关数字为 33,因此在确定日期时将其添加到您的计算中。

这不适合放在评论中,但编码的工作原理如下:

编码方案可以很容易地从数字中找到 day/month/year。

23131 得到 2015 年 2 月 27 日(来自您问题中的示例)。

除以 512 并为 添加 1970(纪元)。

23131 / 512 = 45.xxx => 45 + 1970 = 2015.

取该除法的余数除以 32 得到

23131 mod 512 = 91 / 32 = 2.xxx = February

获得该部分的剩余部分,这是

91 mod 32 = 27