标题:请教下各位大大:有没有体育项目秒表时间的加减算法?
只看楼主
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
看似是时间加减运算,要求精确到1/1000秒(毫秒),结果用时间格式显示。
2022-07-08 10:54
shonken
Rank: 2
等 级:论坛游民
帖 子:95
专家分:21
注 册:2017-1-15
得分:0 
以下是引用mywisdom88在2022-7-8 10:19:33的发言:

楼主是想这样
HH:MM:SS.SSS的格式显示,加减也是按照HH:MM:SS.SSS的格式

你先这样,标准化你的参数,其他的,就容易了
HMSX = "1:2.1234"

*!* 取HHMMSS.SSS的.后面的前面3位
SSS = SUBSTR(IIF(RAT(".",HMSX)>0,SUBSTR(HMSX,RAT(".",HMSX)+1),"000"),1,3)

*!* 分别取HHMMSS中的SS,MM,HH
HMS = IIF(RAT(".",HMSX)=0,HMSX,SUBSTR(HMSX,1,RAT(".",HMSX)-1))
HMS = CHRTRAN(HMS,".","") && 防止HMS中还有"点"
SS = PADL(SUBSTR(IIF(RAT(":",HMS)>0,SUBSTR(HMS,RAT(":",HMS)+1),HMS),1,2),2,"0")
HM = IIF(RAT(":",HMS)=0,"00",SUBSTR(HMS,1,RAT(":",HMS)-1))
MM = PADL(SUBSTR(IIF(RAT(":",HM)>0,SUBSTR(HM,RAT(":",HM)+1),HM),1,2),2,"0")
HH = PADL(SUBSTR(IIF(RAT(":",HM)=0,"00",SUBSTR(HM,1,RAT(":",HM)-1)),1,2),2,"0")

?"前=",HMSX
?"后="+HH+";"+MM+";"+SS+"."+SSS

是的是的,标准化字符串好重要,就怕用户乱输入,谢谢你提供代码
2022-07-08 12:39
shonken
Rank: 2
等 级:论坛游民
帖 子:95
专家分:21
注 册:2017-1-15
得分:0 
以下是引用吹水佬在2022-7-8 10:54:08的发言:

看似是时间加减运算,要求精确到1/1000秒(毫秒),结果用时间格式显示。

是的,吹版
2022-07-08 12:40
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册:2018-3-13
得分:15 
录入不用要求太标准

程序代码:
*-- 测试样例
? 秒表('0:10:10.123', '1.123')
? 秒表('0:10:10.123', '+1.123')
? 秒表('10:10.123', 1.123)
? 秒表('1:10:10.123', -1.124)
? 秒表('1:10:10.123', '-11:1.124')     && 0:59:08.999 与你要的结果不同
? 秒表('0:59:08.999', '+11:1.124') == '1:10:10.123'
*-- end of 测试样例

*-- 秒表运算函数
Function 秒表(v1, v2)
    Local oo
    oo = NewObject('秒表')
    oo.值 = v1
    Return oo.加减(v2)
Endfunc
*-- 秒表类
Define Class 秒表 As Custom
    时 = 0= 0= 0= 0= ''

    Procedure 值_Assign
        Lparameters tcTime
        Local tm, ms

        tm = Ltrim(Alltrim(GetWordNum(tcTime, 1, '.')), '-')
        ms = GetWordNum(tcTime, 2, '.')
        Do Case
        Case Occurs(':', tm) = 0
            tm = '0:0:' + tm
        Case Occurs(':', tm) = 1
            tm = '0:' + tm
        Otherwise
            *-- 啥也不干
        Endcase
        This.时 = Cast(GetWordNum(tm, 1, ':') As I)
        This.分 = Cast(GetWordNum(tm, 2, ':') As I)
        This.秒 = Cast(GetWordNum(tm, 3, ':') As I)
        This.毫 = Cast(ms As I)
    EndProc

    Procedure 加减
        Lparameters tv增量
        Local oo, ss, tt, ms

        tv增量 = Iif(Vartype(tv增量) == 'N', Transform(tv增量), Alltrim(tv增量))
        oo = NewObject('秒表')
        oo.值 = tv增量
        ss = oo.时 * 3600 + oo.分 * 60 + oo.秒
        If Left(tv增量, 1) == '-'
            tt = Datetime(2000,1,1, This.时, This.分, This.秒) - ss
            ms = This.毫 - oo.毫
            If ms < 0
                tt = tt - 1
                ms = ms + 1000
            Endif
        Else
            tt = Datetime(2000,1,1, This.时, This.分, This.秒) + ss
            ms = This.毫 + oo.毫
            If ms > 999
                tt = tt + 1
                ms = ms - 1000
            EndIf
        EndIf
        Return Ttoc(tt, 2) + '.' + Padl(ms, 3, '0')
    EndProc
EndDefine


[此贴子已经被作者于2022-7-8 12:47编辑过]

2022-07-08 12:44
shonken
Rank: 2
等 级:论坛游民
帖 子:95
专家分:21
注 册:2017-1-15
得分:0 
平常输入除了完整格式HH:MM:SS.SSS外,为加快输入效率,设定如:+1.123、+1.11.123、-11:1.123、-0.123 。这样的输入格式?

[此贴子已经被作者于2022-7-8 13:26编辑过]

2022-07-08 12:46
shonken
Rank: 2
等 级:论坛游民
帖 子:95
专家分:21
注 册:2017-1-15
得分:0 
太感谢了,稍变动下就可以实际应用了,谢谢你

以下是引用csyx在2022-7-8 12:44:04的发言:

录入不用要求太标准

*-- 测试样例
? 秒表('0:10:10.123', '1.123')
? 秒表('0:10:10.123', '+1.123')
? 秒表('10:10.123', 1.123)
? 秒表('1:10:10.123', -1.124)
? 秒表('1:10:10.123', '-11:1.124')     && 0:59:08.999 与你要的结果不同
? 秒表('0:59:08.999', '+11:1.124') == '1:10:10.123'
*-- end of 测试样例

*-- 秒表运算函数
Function 秒表(v1, v2)
    Local oo
    oo = NewObject('秒表')
    oo.值 = v1
    Return oo.加减(v2)
Endfunc
*-- 秒表类
Define Class 秒表 As Custom
    时 = 0
    分 = 0
    秒 = 0
    毫 = 0
    值 = ''

    Procedure 值_Assign
        Lparameters tcTime
        Local tm, ms

        tm = Ltrim(Alltrim(GetWordNum(tcTime, 1, '.')), '-')
        ms = GetWordNum(tcTime, 2, '.')
        Do Case
        Case Occurs(':', tm) = 0
            tm = '0:0:' + tm
        Case Occurs(':', tm) = 1
            tm = '0:' + tm
        Otherwise
            *-- 啥也不干
        Endcase
        This.时 = Cast(GetWordNum(tm, 1, ':') As I)
        This.分 = Cast(GetWordNum(tm, 2, ':') As I)
        This.秒 = Cast(GetWordNum(tm, 3, ':') As I)
        This.毫 = Cast(ms As I)
    EndProc

    Procedure 加减
        Lparameters tv增量
        Local oo, ss, tt, ms

        tv增量 = Iif(Vartype(tv增量) == 'N', Transform(tv增量), Alltrim(tv增量))
        oo = NewObject('秒表')
        oo.值 = tv增量
        ss = oo.时 * 3600 + oo.分 * 60 + oo.秒
        If Left(tv增量, 1) == '-'
            tt = Datetime(2000,1,1, This.时, This.分, This.秒) - ss
            ms = This.毫 - oo.毫
            If ms < 0
                tt = tt - 1
                ms = ms + 1000
            Endif
        Else
            tt = Datetime(2000,1,1, This.时, This.分, This.秒) + ss
            ms = This.毫 + oo.毫
            If ms > 999
                tt = tt + 1
                ms = ms - 1000
            EndIf
        EndIf
        Return Ttoc(tt, 2) + '.' + Padl(ms, 3, '0')
    EndProc
EndDefine

2022-07-08 13:07
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册:2018-3-13
得分:0 
正式应用确实还有很多需要考虑的问题,光是容错就够折腾的,例如:
1. 录入数据包含全角字符
2. 时间分隔符(冒号)多于 2
3. 加减数大于被操作数:秒表('12.345', -13.678)
4. 1:67:89
...
当然也不能用于巴黎达喀尔拉力赛这种距离上万时间半月的比赛,时间差大于24小时的都没考虑


[此贴子已经被作者于2022-7-8 14:03编辑过]

2022-07-08 14:01
shonken
Rank: 2
等 级:论坛游民
帖 子:95
专家分:21
注 册:2017-1-15
得分:0 
这正是我需要考虑的,有些比赛是跨天的
当时跨天玩100KM没怎么累,就是犯困.....

以下是引用csyx在2022-7-8 14:01:34的发言:

正式应用确实还有很多需要考虑的问题,光是容错就够折腾的,例如:
1. 录入数据包含全角字符
2. 时间分隔符(冒号)多于 2
3. 加减数大于被操作数:秒表('12.345', -13.678)
4. 1:67:89
...
当然也不能用于巴黎达喀尔拉力赛这种距离上万时间半月的比赛,时间差大于24小时的都没考虑

2022-07-08 14:42
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
不知有无理解错,觉得先要定义这个“时间”的含义
如果是时点,如“+”时间是时点之后,“-”时间是时点之前。
如:3时+20时==>23时;3时+21时==>0时;3时-3时==>0时;3时-4时==>23时
如果是时间累计是时差累计
如:3个小时+21个小时==24个小时;3个小时-4个小时==-1个小时
2022-07-08 14:58
shonken
Rank: 2
等 级:论坛游民
帖 子:95
专家分:21
注 册:2017-1-15
得分:0 
吹版,跟csyx说的差不多,平时应用类似这样
*-- 测试样例
? 秒表('0:10:10.123', '1.123')
? 秒表('0:10:10.123', '+1.123')
? 秒表('10:10.123', 1.123)
? 秒表('1:10:10.123', -1.124)
? 秒表('1:10:10.123', '-11:1.124')     && 0:59:08.999 与你要的结果不同
? 秒表('0:59:08.999', '+11:1.124') == '1:10:10.123


以下是引用吹水佬在2022-7-8 14:58:09的发言:

不知有无理解错,觉得先要定义这个“时间”的含义
如果是时点,如“+”时间是时点之后,“-”时间是时点之前。
如:3时+20时==>23时;3时+21时==>0时;3时-3时==>0时;3时-4时==>23时
如果是时间累计是时差累计
如:3个小时+21个小时==24个小时;3个小时-4个小时==-1个小时

2022-07-08 15:22



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-509515-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.107326 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved