代码中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')
结果如下:
因为是在月份上面直接加了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')
结果如下:
总结
这个问题突然想起了“千年虫”
计算机2000年问题,又叫做“2000年病毒”、“千年虫”、“电脑千禧年千年虫问题”或“千年病毒”。缩写为“Y2K”。是指在某些使用了计算机程序的智能系统(包括计算机系统、自动控制芯片等)中,由于其中的年份只使用两位十进制数来表示,因此当系统进行(或涉及到)跨世纪的日期处理运算时(如多个日期之间的计算或比较等),就会出现错误的结果,进而引发各种各样的系统功能紊乱甚至崩溃。
so
大问题的出现,往往是我们在以前没有想到或者是以前出的一个在当时算不上bug的问题,经过时间的酝酿,最终成为了致命的bug。所以作为一个程序员,我们要对自己的代码负责,要做一个有使命感、责任感的开发工作者。