程序中3个月的期限,带来2月28日3天的恐慌

代码中3个月和90天的差异or2017年2月只有28天带来的程序误差or程序中3个月的期限,带来2月28日3天的恐慌

软件三个月试用期
公司产品规定,新用户注册以后,系统自动给新用户增加三个月的试用期,到期后会提示用户“帐号已经到期,请续费”。产品跑了几个月一直没问题,但是销售部的同事在今天(2016年11月30日)却一脸心急的说产品有bug,昨天(2016年11月29日)统计新注册的用户试用期是到2017年2月28日,今天的新注册的用户试用期也是到2017年2月28日,不同日期注册的用户试用期是同一天,不对。然后就各种巴拉巴拉小魔仙的……

问题所在
原来在设置用户到期时间时是用的如下方法:
mssql:DATEADD(MONTH,3,'用户注册时间')
我们在mssql输入如下sql语句:
print DATEADD(MONTH,3,'2016-11-28') print DATEADD(MONTH,3,'2016-11-29') print DATEADD(MONTH,3,'2016-11-30')
结果如下:

Paste_Image.png

因为是在月份上面直接加了3个月,所以会出现销售同事所说的bug

解决方案
为了解决销售提出的问题,我们将程序修改成直接在当前日期上面加90天,这样就不会出现不同日期注册的用户,试用期会是同一天的情况了。
mssql:DATEADD(DAY,90,'注册时间)
我们依然在mssql输入如下sql语句
print DATEADD(DAY,90,'2016-11-28') print DATEADD(DAY,90,'2016-11-29') print DATEADD(DAY,90,'2016-11-30')
结果如下:

Paste_Image.png

总结
这个问题突然想起了“千年虫”

计算机2000年问题,又叫做“2000年病毒”、“千年虫”、“电脑千禧年千年虫问题”或“千年病毒”。缩写为“Y2K”。是指在某些使用了计算机程序的智能系统(包括计算机系统、自动控制芯片等)中,由于其中的年份只使用两位十进制数来表示,因此当系统进行(或涉及到)跨世纪的日期处理运算时(如多个日期之间的计算或比较等),就会出现错误的结果,进而引发各种各样的系统功能紊乱甚至崩溃。

so
大问题的出现,往往是我们在以前没有想到或者是以前出的一个在当时算不上bug的问题,经过时间的酝酿,最终成为了致命的bug。所以作为一个程序员,我们要对自己的代码负责,要做一个有使命感、责任感的开发工作者。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容