如何解决易语言的千年虫问题
最近,在研究基于易语言的编写的卡密管理系统,其中一个环节就是根据注册码和机器码的特征经过预先设置好的算法来计算授权码,但是授权不可能让你用一辈子,总得有个时间限制吧。于是我准备在授权码加入时间验证,我的思路是引入一个可以提供北京时间的API接口,然后通过JSON来解析现在的北京时间是unix时间戳,再将授权码里记载的加密信息还原成unix时间戳,两者比对,若授权码里的unix时间戳小于JSON读取到的时间戳则判定为授权过期,软件再次回到未注册状态。
但是易语言是32位架构,无论用什么方法来转换时间,只要时间晚于2038年1月19日03:14:07,也就是unix时间戳大于2147483647的时候,都会回到1900年,unix时间戳也会因结果溢出而变为负数,这种情况就是常提到的千年虫问题。
有大佬知道怎样解决。
手动解析那个时间戳字符串,带毫秒的时间戳也就13位字符,9999年也就15位字符,所以可以这样:把后8位字符转换成整数2,剩下的字符转换成整数1;每个时间戳都照这样转换;要比较的时候,先比较整数1,如果整数1相等,再比较整数2 类似于这样?
https://e.125.la/fun-1713.html 做个补充
比如这个函数
我在调用的时候在参数里填写2038年1月19日03:14:10,最后返回结果本应是2147483649,但由于千年虫的问题导致返回结果为-2147483646
这种问题有没有解决方法,总不能再要求作者吴涛出个64位的易语言吧 涛之雨 发表于 2023-8-3 11:12
类似于这样?
https://e.125.la/fun-1713.html
这个我查到过,但是不知道转成64位后如何还原成日期 如果只能使用32位时间戳,那么可以使用无符号整型来存储时间戳。这个错误会被延后到2106年。
又或者更换64位。 烟99 发表于 2023-8-3 11:14
做个补充
比如这个函数
易语言支持库很旧了,应该是增减时间这个命令使用整数型变量导致溢出
用精易模块就好啦
用长整数 64位的
自己写个时间转换函数
很简单的
你把时间单位分割一下 一个一个相减 后乘以你要转换的单位然后全部加起来不就行了? 易语言不太懂,这样好像可以转过来
@你好,再见 @woflant 不考虑精益模块,因为精益模块极易误报,但是可以考虑把精益模块相关函数的源码放到程序中
页:
[1]
2