谷歌日历日期密钥

4

谷歌在GoogleCalendar HTML中为每一天使用唯一的DateKeys,例如:

<div 
  data-datekey="129"
  role="gridcell" 
  tabindex="-1" 
  jsname="RjPD4e" 
  aria-labelledby="tsc-0" 
  data-column-index="0"  
  data-principal-ids="amFuLm5pY2tsYXNAbmFtaWNzLmNvbQ" 
  class="YvjgZe Qbfsob">

有没有公式可以计算给定日期键的日期?

2个回答

6

回应@jantimon的答案:我猜他们必须进行大量日期计算并希望其效率高。

奇怪的是,如果您查看侧边栏中的小日历,它使用data-date属性而非data-datekey 属性,并使用YYYYMMDD格式。

无论如何,我使用位运算符重写了您的转换函数,因为这种方式更易于阅读。

function datekeyToDate(key) {
    /* # BITS: [year_rel(6)][month(4)][day(5)] */
    const day = key & 0b11111;
    const month = (key>>5) & 0b1111;
    const year_rel = (key>>9);
    const year = 1970 + year_rel;
    return new Date(year, month, day);
}

function dateToDatekey(date) {
    const y = date.getFullYear() - 1970;
    const m = date.getMonth()+1;    /* getMonth() returns 0-based index */
    const d = date.getDate();
    return (y<<9) + (m<<5) + d;
}

使用这种方法创建一个日程日历可靠吗?我想知道为什么关于日期的解决方案不多。它似乎比我见过的大多数形式更高效。 - Murilo de Melo Reis

6
看起来dateKey代表自1970年1月1日以来的天数,格式经过了字节移位优化。
一年有2^9512)天。 一个月有2^532)天。
要计算01.01.1970datekey,您需要计算:

0年(自1970年以来)* 512
+ 1个月* 32
+ 1
= 33

要计算01.01.2000datekey,您需要计算:

30年(自1970年以来)* 512
+ 1个月* 32
+ 1
= 15393

要计算给定日期键的日期,可以执行相反操作。模运算可能如下所示:
function getDate(dateKey) {
  const yearOffset = (dateKey - 32) % 512;
  const year = (dateKey - 32 - yearOffset) / 512;
  const day = yearOffset % 32;
  const month = (yearOffset - day) / 32;
  return new Date(year + 1970, month, day);
}

有人知道为什么会提出这样的逻辑吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接