嘿 Siri,今年过去多久了?
2022-1-6 17:30:10 Author: sspai.com(查看原文) 阅读量:31 收藏

一年之计在于春。元旦已过,新春将至,是时候投入到新一年的规划中。为此,不妨用些可量化的方式提醒时光易逝,激励自己珍惜时间——比如不时算算「今年过去了百分之几」。当然,这么简单的问题并不需要依赖那些营销号帮我们做算术;利用自带的快捷指令,完全可以做到随手查看年度百分比,顺便还能画出一个「年度进度条」。

使用场景

一年之计在于春。元旦已过,新春将至,是时候投入到新一年的规划中。为此,不妨用些可量化的方式提醒时光易逝,激励自己珍惜时间——比如不时算算「今年过去了百分之几」。

当然,这么简单的问题并不需要依赖那些营销号帮我们做算术;利用自带的快捷指令,完全可以做到随手查看年度百分比,顺便还能画出一个「年度进度条」。

使用步骤

下载:年度百分比

下载后直接运行即可。你也可以直接说「嘿 Siri,年度百分比」来运行。

制作思路

如上所述,这个快捷指令要解决的问题并不困难,但问题是很容易做得繁琐。加上快捷指令的操作至今不算特别方便,如果思路不清晰,很容易在步骤堆积之后手忙脚乱。

为此,我们首先根据预期的输出结果——年度百分比和年度进度条——对该快捷指令所需的功能进行分解,可以大致拆分出如下问题:

  1. 如何获取当前日期与年初的天数差值;
  2. 如何计算已经过天数占全年天数的百分比,进而转化为进度条;
  3. 如何汇总和输出结果。

下面分别介绍本快捷指令的解决思路。

如何获取当前日期与年初的天数差值

对于这个问题,最简单粗暴的方法当然是获取当前日期、构造一个当年 1 月 1 日的日期,然后用「获取时长」的步骤求差值。但以上三步其实可以通过一步来实现。这里的技巧在于,快捷指令中的日期变量都是可以自行指定格式的,并且可以在格式表述中将特定的日期部件改为固定值。

具体而言,我们将「获取时长」步骤的前后两个空位都选为「当前日期」。然后,选择前一个日期(起始日期),将其「日期格式」改为「自定」,然后在下方输入yyyy-01-01。其中,yyyyISO-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 全部替换为实心方块,就完成了「已经过」部分进度条的绘制。

「未经过」部分的空心方块怎么处理呢?当然可以再算一遍当年剩下日期的百分比,然后如法炮制做除法、幂方计算和文本替换,但那还是麻烦了。注意到,我们需要的输出结果中:

  1. 总是有 10 个方块;
  2. 实心方块的数量为 0—10 个;且
  3. 空心方块总是在实心方块(如果有)之后出现,数量也是 0—10 个。

因此,只要把最多可能出现的空心方块(10 个)一股脑画在实心方块的后面,然后从第一个方块开始截取十个字符,就是我们需要的绘制结果。

为此,我们使用正则表达式:

1(.{10}).*

它的含义是依次含有如下内容的字符串:

  1. 字符 1;后接
  2. 任意字符(.)出现 10 次({10});后接
  3. 任意字符(.)出现 0 次或多次(*)。

并且,第 2 部分——我们需要的 10 个方块——外侧的括号,将该部分的匹配结果捕获为一个分组。由于该表达式中只有一对括号,这个分组就可用 $1 来引用。

上述步骤的思路如下图所示:

这样,我们就可以通过一个「替换文本」步骤,获得最终的进度条。

两个进度条色块都处理好之后,接下来就是汇总信息输出了。但在此之前,还需要先把之前计算的年度占比化为百分比,为此,使用「格式化数字」操作取到第一步计算结果的小数点后两位、再乘以 10 即可。

如何汇总和输出结果

到此为止,计算步骤都已经完成了,得到了年度进度色条块和年度百分比。接下来就要合并数据并输出显示了。

这里,使用一个「文本」操作汇总数据,「日期之间的时长」和「进度色块条」使用魔法变量(Magic Variable)引用。最后还可以抖个机灵,增加一句珍惜时间的名言警句。

最后,使用「显示提醒」步骤将结果输出。这里之所以不采用类似的「显示通知」步骤,是考虑到需要输出的内容比较长,而「显示通知」存在 256 个字符的长度限制,不适合吟诗作赋,故改用空间更灵活的「显示提醒」。此处的标题还可以引用一下「当前日期」变量,使用自定格式的默认值。

最后显示的结果如下:

最后祝新的一年中成就满载、心想事成 :)


文章来源: https://sspai.com/post/70765
如有侵权请联系:admin#unsafe.sh