<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>日历 on Lutong's Homepage</title><link>https://www.elliot98.top/tags/%E6%97%A5%E5%8E%86/</link><description>Recent content in 日历 on Lutong's Homepage</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 03 Aug 2021 10:33:17 +0800</lastBuildDate><atom:link href="https://www.elliot98.top/tags/%E6%97%A5%E5%8E%86/index.xml" rel="self" type="application/rss+xml"/><item><title>Notion实现循环事件、重复事件、每日打卡</title><link>https://www.elliot98.top/post/tech/notion-calendar/</link><pubDate>Tue, 03 Aug 2021 10:33:17 +0800</pubDate><guid>https://www.elliot98.top/post/tech/notion-calendar/</guid><description>&lt;h2 id="优雅的notion不优雅"&gt;优雅的Notion不优雅&lt;/h2&gt;
&lt;p&gt;其实我一直都在思考，使用什么样的工具可以使我的生活变得井井有条，变得有效率、有条理、且精致。从功能上来讲，我希望能有效管理我的日程、待办事项、记笔记等等。当然，我对于工具是非常挑剔的，使用过QQ全家桶、Outlook全家桶、Google全家桶还有Apple全家桶。当然他们各自有各自的好，但也有我不能接受的地方。且不说Google不能满足我对随时取用的要求，QQ邮箱的日程和联系人又太过简陋。苹果的工具非常优雅，也很好用；可自从我更换小米手机之后（虽然这些天又换回了iPhone12），我就有意从苹果的生态中脱离出来，生怕被绑定。更何况生产力的PC电脑上是难以使用苹果的软件的。于此，我其实长期使用Outlook全家桶，还是365的会员，算是这诸多产品中给我体验最好的产品。直到我遇到了Notion，我认为我找到了一个可以同时满足我这些需求的，一个跨平台的、好用且优雅的软件。&lt;/p&gt;
&lt;p&gt;**当然，这只是我以为。**当设置好了database，打算往里面填充日程的时候，我很快发现了Notion在重复日程、循环事件、每日打卡的功能是缺失的！我不相信Notion功能是残缺的，我在网络上搜索着最优姿势，但是我很快被打脸了。Notion的功能缺失是残缺的，特别是日程上。三年来不断有人在各种论坛上讨论这件事情，但是确始终没有得到改善。毕竟Notion功能再强大，也不是图灵完全的。&lt;/p&gt;
&lt;h2 id="不优雅的重复事件"&gt;不优雅的重复事件&lt;/h2&gt;
&lt;p&gt;于是我开始寻找折中。一种解决方式似乎是可以使用Notion提供的API来操作，具体的解决方案我还没有研究透，或许有时间回去研究吧？可是效率工具只是效率工具，而非效率本身。花很长时间研究如何完成这个功能似乎不很值得，且不说外接服务器很不优雅。&lt;/p&gt;
&lt;p&gt;我参考了论坛里各位的说法，设计了一种折中办法，不优雅，但是还能用。我的日程&lt;code&gt;database&lt;/code&gt;有&lt;code&gt;Tag&lt;/code&gt;、&lt;code&gt;Due&lt;/code&gt;和&lt;code&gt;Next Due&lt;/code&gt;三个属性。&lt;code&gt;Tag&lt;/code&gt;我用于标记这个事件的类别。当然，我定义了四个特别的标记，分别是&amp;quot;Daily&amp;quot;, &amp;ldquo;Weekly&amp;rdquo;, &amp;ldquo;Monthly&amp;rdquo; 以及 &amp;ldquo;Yearly&amp;rdquo;。如果事件中具有上述四个标记之一，那么是循环标记。&lt;code&gt;Due&lt;/code&gt;是首次发生该事件这个日期，对于一次性事件来说，就是时间的日期。最关键的是，我设计了一个&lt;code&gt;Next Due&lt;/code&gt;属性，这是一个Formula属性。我设计为计算出循环日期的下一个截止日期；如果是一次性时间，那么它等于&lt;code&gt;Due&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;具体的Next Due计算代码放在下面，可以参考：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-jsx" data-lang="jsx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;contains&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Tags&amp;#34;&lt;/span&gt;),&lt;span style="color:#e6db74"&gt;&amp;#34;Weekly&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;dateAdd&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Due&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ceil&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;dateBetween&lt;/span&gt;( &lt;span style="color:#a6e22e"&gt;now&lt;/span&gt;(), &lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Due&amp;#34;&lt;/span&gt;), &lt;span style="color:#e6db74"&gt;&amp;#34;weeks&amp;#34;&lt;/span&gt;))&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;weeks&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;contains&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Tags&amp;#34;&lt;/span&gt;),&lt;span style="color:#e6db74"&gt;&amp;#34;Monthly&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;dateAdd&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Due&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ceil&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;dateBetween&lt;/span&gt;( &lt;span style="color:#a6e22e"&gt;now&lt;/span&gt;(), &lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Due&amp;#34;&lt;/span&gt;), &lt;span style="color:#e6db74"&gt;&amp;#34;months&amp;#34;&lt;/span&gt;))&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;months&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;contains&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Tags&amp;#34;&lt;/span&gt;),&lt;span style="color:#e6db74"&gt;&amp;#34;Daily&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;dateAdd&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Due&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ceil&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;dateBetween&lt;/span&gt;( &lt;span style="color:#a6e22e"&gt;now&lt;/span&gt;(), &lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Due&amp;#34;&lt;/span&gt;), &lt;span style="color:#e6db74"&gt;&amp;#34;days&amp;#34;&lt;/span&gt;))&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;days&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;contains&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Tags&amp;#34;&lt;/span&gt;),&lt;span style="color:#e6db74"&gt;&amp;#34;Yearly&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;dateAdd&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Due&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ceil&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;dateBetween&lt;/span&gt;( &lt;span style="color:#a6e22e"&gt;now&lt;/span&gt;(), &lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Due&amp;#34;&lt;/span&gt;), &lt;span style="color:#e6db74"&gt;&amp;#34;years&amp;#34;&lt;/span&gt;))&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;years&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Due&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Notion的Formula其实类似一个函数式程序，还是挺好用的。这样，我就实现了自动计算循环事件的下一个日程的时间。但是，这不够完善。最大的问题在于这样只能显示出下个时间，但是没有办法设置&lt;strong&gt;提醒&lt;/strong&gt;！这就很拙劣了！&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;发现一个Bug，当日期包括时间的时候，似乎工作并不正常。有机会我要来处理一下。&lt;/p&gt;
&lt;/blockquote&gt;</description></item></channel></rss>