最近在做一个新项目,后端为Ruby语言,有一段代码需求是这样的:
判断今天有没有存入记录,如果没存入就存一条,存入的话就不再存。
因为代码是在实时的脚本运行,考虑到防止大规模查询记录表,就额外加了一个字段记录上次存入时间格式为(Y-M-D);
然后把上次存入的时间(a_time)跟 今天的0时0分0秒(b_time) 作对比,如果 a_time < b_time,即表明今天还未存入记录,则进行存储操作。写完之后,也进行了测试,发现并没什么不妥。直到部署到正式环境之后!!!
凌晨12点进行了部署,第二天早上发现,每个人都创建了几百条记录(幸亏做了双重限制,只是几百条),然后很多用户疯狂通过多发的记录套现(具体细节不在此处描述)。。。。。连续补救了18个小时,终于把数据补救回来,公司的亏损也挽救了。
造成此重大BUG的原因,因为少写了一个Time.parse()方法
代码例:
if last_save_time(Time) < "2020-11-11 00:00:00"(String)
#存入操作,此时更新last_save_time为今天的凌晨0点0分0秒
)
前者last_save_time是time类型的,中国东八区,即+800;
后者字符串时间,并没有时区,两者看似一样的值,但实际是少了8小时,对比就成了:
if last_save_time(Time) < “2020-11-10 16:00:00”(Time)
#那么这个时候,无论今天再怎么保存,它都会进入这个条件内,进行再次创建记录
end
在进行代码测试的时候又不是0点-8点,就算减了8小时他还是今天,所以没有发现BUG。。。。
解决方案应该在后面的字符串时间加上Time.parse(),如Time.parse(“2020-11-11 00:00:00”),这样它就是带时区的时间了
无语…