我正在编写一个Google日历侧边栏小工具,以跟踪每个事件标签的总小时数(根据事件的详细信息确定,即"标签:工作")。
用户可以更改他们在日历中查看的当前周、月、日,我希望能够计算与他们当前视图相关的小时数。
我在小工具API(或任何其他Google日历API)中看不到允许小工具访问当前显示的视图的任何地方。我注意到该 URL 有一个锚标记,看起来像
g|week-2+23127+23137+23131
对应于在周模式下查看 2015 年 2 月 23 日星期一 - 2015 年 3 月 1 日星期日。
我还注意到以下关系:
-
23127
是视图中的第一天 -
23137
是视图中的最后一天 -
23131
是在月视图中选择的日期(位于日历左侧)
如果有一种方法可以使用 API 获取当前显示的视图,那将是理想的,但我会满足于解析锚标记。不幸的是,我无法破译这些数字是如何工作的。
Google API
可以使用以下调用访问当前显示的日期范围:
google.calendar.subscribeToDates(function(d) { // do something });
其中 d 是 Google 日期范围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,因此在确定日期时将其添加到您的计算中。
这不适合注释,但以下是编码的工作原理:
编码方案可以很容易地从数字中找到日/月/年。
以 23131 为例,它产生 2015 年 2 月 27 日(来自您问题中的示例)。
除以 512 并添加 1970(纪元)作为年份。
23131/512 = 45.xxx => 45 + 1970 = 2015。
得到该除法的其余部分并除以 32 以找到月份。
23131 mod 512 = 91/32 = 2.xxx = 二月
得到该部门的剩余部分,这是一天。
91 mod 32 = 27