一年之计在于春。元旦已过,新春将至,是时候投入到新一年的规划中。为此,不妨用些可量化的方式提醒时光易逝,激励自己珍惜时间——比如不时算算「今年过去了百分之几」。当然,这么简单的问题并不需要依赖那些营销号帮我们做算术;利用自带的快捷指令,完全可以做到随手查看年度百分比,顺便还能画出一个「年度进度条」。
一年之计在于春。元旦已过,新春将至,是时候投入到新一年的规划中。为此,不妨用些可量化的方式提醒时光易逝,激励自己珍惜时间——比如不时算算「今年过去了百分之几」。
当然,这么简单的问题并不需要依赖那些营销号帮我们做算术;利用自带的快捷指令,完全可以做到随手查看年度百分比,顺便还能画出一个「年度进度条」。
下载:年度百分比
下载后直接运行即可。你也可以直接说「嘿 Siri,年度百分比」来运行。
如上所述,这个快捷指令要解决的问题并不困难,但问题是很容易做得繁琐。加上快捷指令的操作至今不算特别方便,如果思路不清晰,很容易在步骤堆积之后手忙脚乱。
为此,我们首先根据预期的输出结果——年度百分比和年度进度条——对该快捷指令所需的功能进行分解,可以大致拆分出如下问题:
下面分别介绍本快捷指令的解决思路。
对于这个问题,最简单粗暴的方法当然是获取当前日期、构造一个当年 1 月 1 日的日期,然后用「获取时长」的步骤求差值。但以上三步其实可以通过一步来实现。这里的技巧在于,快捷指令中的日期变量都是可以自行指定格式的,并且可以在格式表述中将特定的日期部件改为固定值。
具体而言,我们将「获取时长」步骤的前后两个空位都选为「当前日期」。然后,选择前一个日期(起始日期),将其「日期格式」改为「自定」,然后在下方输入yyyy-01-01
。其中,yyyy
是 ISO-8601 标准下的「年」变量,这种格式意味着所得结果的年份随实际年份而变,但月和日则固定为 1 月 1 日。后一个日期(结束日期)保持不变,即输出当前的年月日。
这样一来,这个「获取时长」步骤的输出结果直接就是今天与年初的天数差值。
接下来要解决的是绘制进度条。这里,考虑到快捷指令的有限功能和 iPhone 屏幕的有限空间,我们采用一个比较简单的绘制方法,用十个方块各代表 10% 的进度,已经经过的用实心方块 ◼
,尚未经过的用空心方块 ◻
。
这样,问题就转化为如何获取当前已经过日期占全年日数百分比的十位数。这个数字是几,就需要绘制几个实心方块,剩下的都是空心方块。
其中,百分比的计算很简单,用自带的算术步骤即可:
注意上面截图中,笔者没有将时长除以全年天数 365,而是除以 10 倍的 36.5。这是因为该除法做完后还涉及取整,而快捷指令只能控制个位数层面的取整。因此,这里用 36.5 做除数,然后串接一个「为数字取整」步骤即可。
至于取整方式,我们选择比较保守的「始终向下取整」,以避免那种进度才过了 95% 进度条就直接拉满的情况——对自己还是不要太严格。
以本文写成时的日期 2022 年 1 月 4 日为例,它与今年第一天的天数差为 3 天,将这个数值除以 36.5
得到的结果是 0.08,因此需要的实心方块是 0 个——还有大把时光可以挥霍。假设时光穿越到 2022 年 11 月 14 日,那么距离年初 307 天,除以 36.5 的结果是 8.41,因此需要的实心方块是 8 个。
知道了需要的方块数量,下一步就是绘制了。
对此,网上现有解决方案中,很多使用层层嵌套 if 语句的方式,根据上一步计算的除法结果区间,分别输出不同数量的黑白方块,既繁琐又低效。
这里,我们可以展开想象的翅膀:注意到 10 的 n 次幂中恰好有 n 个数字 0;换句话说,把这里的 n 换成上一步除法取整的结果,算出来有多少个 0,就需要多少个实心方块。
落实到操作中,只要直接用「文本替换」功能把结果中的 0 全部替换为实心方块,就完成了「已经过」部分进度条的绘制。
「未经过」部分的空心方块怎么处理呢?当然可以再算一遍当年剩下日期的百分比,然后如法炮制做除法、幂方计算和文本替换,但那还是麻烦了。注意到,我们需要的输出结果中:
因此,只要把最多可能出现的空心方块(10 个)一股脑画在实心方块的后面,然后从第一个方块开始截取十个字符,就是我们需要的绘制结果。
为此,我们使用正则表达式:
1(.{10}).*
它的含义是依次含有如下内容的字符串:
1
;后接.
)出现 10 次({10}
);后接.
)出现 0 次或多次(*
)。并且,第 2 部分——我们需要的 10 个方块——外侧的括号,将该部分的匹配结果捕获为一个分组。由于该表达式中只有一对括号,这个分组就可用 $1
来引用。
上述步骤的思路如下图所示:
这样,我们就可以通过一个「替换文本」步骤,获得最终的进度条。
两个进度条色块都处理好之后,接下来就是汇总信息输出了。但在此之前,还需要先把之前计算的年度占比化为百分比,为此,使用「格式化数字」操作取到第一步计算结果的小数点后两位、再乘以 10 即可。
到此为止,计算步骤都已经完成了,得到了年度进度色条块和年度百分比。接下来就要合并数据并输出显示了。
这里,使用一个「文本」操作汇总数据,「日期之间的时长」和「进度色块条」使用魔法变量(Magic Variable)引用。最后还可以抖个机灵,增加一句珍惜时间的名言警句。
最后,使用「显示提醒」步骤将结果输出。这里之所以不采用类似的「显示通知」步骤,是考虑到需要输出的内容比较长,而「显示通知」存在 256 个字符的长度限制,不适合吟诗作赋,故改用空间更灵活的「显示提醒」。此处的标题还可以引用一下「当前日期」变量,使用自定格式的默认值。
最后显示的结果如下:
最后祝新的一年中成就满载、心想事成 :)