takashiki 发表于 2019-6-28 07:14:59

在Win7下重现Bug10的BUG [计算器BUG]

起因:看到这个我为 Windows 10 修复了一个 bug,我就看看我的Win7计算器有什么表现。
Windows的计算器BUG不知道发现了多少了,比一般专写BUG的程序员写的BUG还多还隐蔽
更NB的是,Win10的计算器是开源的,源代码的逻辑实在是看不懂,堪称简单问题复杂化的典范,可以作为我辈楷模,以后我们也要写这种又臭又烂还有隐藏BUG的代码。

计算日期间隔(请查看差(年、月、周、天)),我的版本是6.1.7601,不知道其他版本有没有这个问题:

其他三个都没有问题,就是下面这个,呵呵呵呵。




然后看看bug10关于日期之差的计算:DateDifference calculate_difference(start_date, end_date) {
    uint[] diff_types =
    uint[] typical_days_in_type =
    uint[] calculated_difference =
    date temp_pivot_date
    date pivot_date = start_date
    uint days_diff = calculate_days_difference(start_date, end_date)

    for(type in differenceTypes) {
      temp_pivot_date = pivot_date
      uint current_guess = days_diff /typicalDaysInType
      if(current_guess !=0)
            pivot_date = advance_date_by(pivot_date, type, current_guess)
      
      int diff_remaining
      bool best_guess_hit = false
      do{
            diff_remaining = calculate_days_difference(pivot_date, end_date)
            if(diff_remaining < 0) {
                // pivotDate has gone over the end date; start from the beginning of this unit
                current_guess = current_guess - 1
                pivot_date = temp_pivot_date
                pivot_date = advance_date_by(pivot_date, type, current_guess)
                best_guess_hit = true
            } else if(diff_remaining > 0) {
                // pivot_date is still below the end date
                if(best_guess_hit)
                  break;
                current_guess = current_guess + 1
                pivot_date = advance_date_by(pivot_date, type, 1)
            }
      } while(diff_remaining!=0)

      temp_pivot_date = advance_date_by(temp_pivot_date, type, current_guess)
      pivot_date = temp_pivot_date
      calculated_difference = current_guess
      days_diff = calculate_days_difference(pivot_date, end_date)
    }
    calculcated_difference = days_diff
    return calculcated_difference
}反正我才疏学浅,只会把两个日期直接相减,惭愧。


shian0551 发表于 2019-6-28 08:06:08

只是BUG,不是后门,后门很紧的。

icoyool 发表于 2019-6-28 08:11:14

要不楼主自己写一个? 怎么也得考虑闰年和月份日期吧,直接怎么减?

leafstamen 发表于 2019-6-28 08:14:15

bug10上7-31~12-30是:5 月, 613566756 周, 3 天

takashiki 发表于 2019-6-28 08:50:51

icoyool 发表于 2019-6-28 08:11
要不楼主自己写一个? 怎么也得考虑闰年和月份日期吧,直接怎么减?

最烦的就是你这种不懂装懂还要抬杠的了,日期变换成年、月、日、周是有API的,直接调用就可以了,你管他具体怎么实现的。
我自己写啊,我是用Delphi的,让你看看DateUtils.pas提供的函数,其他语言也会有自己的函数库:

takashiki 发表于 2019-6-28 08:56:52

gamethink 发表于 2019-6-28 08:47
别以为简单,其实计算器的软件比较复杂的,一般人写不出来

说得好像我没有写过似的... 开源代码一大堆,现在已经不是单枪匹马造轮子的时代了,啥样的轮子都有。我自己写的高精度的,和微软的计算器对比下:

xly 发表于 2019-6-28 08:58:47

为啥我觉得win10是有史以来最好用的系统。
我装的LTSC 版本。

zllfdd 发表于 2019-6-28 09:15:06

xly 发表于 2019-6-28 08:58
为啥我觉得win10是有史以来最好用的系统。
我装的LTSC 版本。

升级1903,先是vmware不能用了,虚拟机系统各种卡死,vmware卡死,关不掉,只能重启宿主系统,升级最新vmware解决。
然后发现显示屏亮度不能调,现在又好了。

linghu2 发表于 2019-6-28 11:08:54

写这么多代码就是避免调用API啊{:titter:}

tomzbj 发表于 2019-6-28 11:13:35

计算日期间隔是最麻烦的。。。
特别是涉及古代日期,还得考虑1582年改历,以及改历在各国还不是一起执行,比如俄罗斯到十月革命以后才改。

elecfun 发表于 2019-6-28 12:37:06

原来还有这种BUG

mcu5i51 发表于 2019-6-28 15:08:33

试了一下,我被吓到了

OOXX110 发表于 2019-6-28 18:20:48

BUG10,1803没有发现这个问题{:lol:}

hyz_avr 发表于 2019-6-28 18:35:30

xly 发表于 2019-6-28 08:58
为啥我觉得win10是有史以来最好用的系统。
我装的LTSC 版本。

我也这样觉得,不过我用的是专业版,并且一直保持最新.{:lol:}

hyz_avr 发表于 2019-6-28 18:35:59

mcu5i51 发表于 2019-6-28 15:08
试了一下,我被吓到了

至少总天数 152天是对的嘛 {:lol:}

tlptotop 发表于 2019-6-28 19:34:58

感觉楼主很厉害,
没错,我说的是语气!

FireBrain 发表于 2019-6-28 21:49:57

我都不知道计算器还可以计算日期差这种骚操作

jeffwei 发表于 2019-6-28 23:49:45

算天数差值是不是可以直接换成UTC的秒数,得到差值,然后除以每天秒数就能得到相差天数?
页: [1]
查看完整版本: 在Win7下重现Bug10的BUG [计算器BUG]