日期:2014-05-16  浏览次数:20327 次

数据库时戳字段解析欠考虑导致的运行时异常

最近维护了一个C++写的需要访问数据库的软件,又见到了使用字符串解析日期字段带来的问题。问题的发现是因为以前的机器坏了,换了一台新的,结果,软件拷贝过去死活跑不起来。经过一番检查,想到可能是本地时间格式的问题,于是打开控制面板--区域语言选项,时间日期设置是用反斜杠分割的,如 2012\11\6 12:11:7,  而以前的机器上是  2012-11-06 12:11:07 ,直接设置回去,程序正常!

虽然没有这个软件的代码,还是能猜出大概原因。软件中,需要从数据库中读取一个个日期、时间,而后,分离出各个成分(年月日时分秒),再做运算。使用 select xxx from tb 选出的日期被强制转换为字符串,此时,转换成的字符串格式高度依赖客户端(即程序运行的机器)的区域与语言设置。如果简单使用一种分割符号来匹配,换台机器就可能发生错误,如果解析方法不当,搞不好还会溢出。因此,对时间日期,最好采用如下措施:

1、能在sql 中判断的,就在 sql 中做

2、需要提取的,要么使用数据库提供的日期提取函数,确切规定转换格式(直接 select 成字符串,而不是让驱动来转)。

3、或者使用 支持外部转换的封装库,比如Qt 的 QDateTime,从QVariant 直接转到 QDateTime,解析的问题全被库帮你搞定了。

4、对只需要比较前后或者计算时差的应用,直接用 time_t ,两个进行算术减法。

   对本次应用,因为没有代码,只能重新包装一个安装程序,在安装程序里设置日期时间格式了。这是下下策。