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



我正在编写一个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.startTimed.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

最新更新