如何快速计算日期差

近日遇到一奇葩案件,2007年的河南洛阳某县,当事人因合同诈骗被刑拘,取保候审金竟高达30W(实务中,刑事犯罪的保证金浮动区间为2K-5W,当然不能一概而论)。

但该案更离奇之处在于,执行机关自取保候审释放后,一直懈怠敷衍,2008年迄今,始终未办理解除取保候审强制措施程序,也未通知决定机关,更遑论出具任何撤案文书。当事人及其代理律师为此奔走期间,公安机关一通电话,告知当事人代理律师,以无法联系到当事人为由,没收其30W保证金。

钓鱼式司法案件屡见不鲜,但涉案金额如此之巨的,倒是罕有。

在写国家赔偿申请书时,遇到一个利息计算的issue,按理说,翻一下日历或者打开Fantastical 计算一下日期差就是了,但这个案件比较特殊,案件发生至今已逾11年,翻日历掰手指头算?这活我才不乐意做。

在线计算工具并不友好

第一反应是想了解取保候审释放之日起距今有多少个月份。放度娘一搜,国内市面上在线日期差计算工具,基本只支持天数,而不支持年、月数显示。

国外的timeanddate 倒是支持日期差计算,不过终究在墙外,不适宜日常本地化的小平快的需求。

利用Excel的DATEDIF函数

想起Excel有很多函数能满足稀奇古怪的需求,印象最深的是有个能在老板眼皮子底下用Excel划水刷论坛看股票的改造。查了一下,Excel确实有一个DATEDIF函数 可供利用。

C3=DATEDIF(A3,B3,"d") // 显示间隔天数
d显示间隔天数
d显示间隔天数
C3=DATEDIF(A4,B4,"m")// 显示间隔月数
m显示间隔月数
m显示间隔月数
C3=DATEDIF(A5,B5,"y")// 显示间隔年数
y显示间隔年数
y显示间隔年数

看似便捷对吧?不过为得到上述结果,足足花了5分钟构建数据表、引入不同函数,还不算上Mac打开Excel的龟速时间。我绝对无法接受如此低效的workflow。

Alfred Workflow之DATE SPAN

Mac最得心应手的工具是什么,帽子王Alfred!Powerpack还支持自定义workflow。那么,有没有现成的workflow来支持日期差计算呢?

放骨狗嗅了一圈,还真有个名为Date Span 的Alfred workflow专门解决了日期差的计算难题。据作者说明,是基于PHP 5.3以上版本的DateInterval功能,具体代码可以参考PHP文档

使用实例说明

1.计算当前日期时间与某个mm/dd/yy日期的差,示例:

datespan 6/23/2007 //注意日期格式是[月/日/年]

2.计算任意两个mm/dd/yy日期的差,示例:

datespan 6/23/2007 to 4/23/2020 //注意中间有一个to

3.计算任意两个mm/dd日期的差,示例:

datespan 3/23 to 11/12 //注意中间有一个to

显而易见,Date Span支持精确到分钟的日期差显示,另外也支持工作周(bussiness week)、周(week)、天数(day)、小时(hour)、分钟(minute)等单位,唯独不支持月数(month),恐怕这也是唯一的遗憾了,常见的解决办法无非有:

  • 直接心算 : $f(x)=a years + b months =(12a + b)months$
  • 修改源码
    在Date Span配置界面右下角跳转到Data Span目录:

找到datespan.php,用编辑器打开增加以下两处代码

$total_months   = intval($diff->format('%m'))+intval($diff->format('%y'))*12;
if ($total_months > $months)
{
    $wf->result(
        "months",
        pluralize('month', $total_months),
        pluralize('month', $total_months),
        "copy to clipboard",
        $icon
    );
}

结果如图:

Alfred Workflow之Date Calculator

新发现另外有个名为Date Calculator 的Workflow也可以实现上述计算,而且参数众多,可以任意组合,足以满足各类需求。

基础输入格式:

dcalc 23.06.07 - now

now后面可以加上w/m/d等参数,分别表示周/月/天,插件还允许用数学符号代替常用日期,如:

  • < 代表yesterday
    • 代表today
  • 代表tomorrow

  • & 代表time

下面略举几例:

只显示周数

dcalc 23.06.07 - now w或者dcalc 23.06.07 - * w

只显示月数

dcalc 23.06.07 - now m或者dcalc 23.06.07 - * m

只显示天数

dcalc 23.06.07 - yesterday d或者dcalc 23.06.07 - < w

显示周数+天数

dcalc 23.06.07 - tomorrow wd或者dcalc 23.06.07 - > w

显示月数+周数+天数

dcalc 23.06.07 - now mwd

显示全部参数

dcalc 23.06.07 - now long