C#中如何比较00H:00M:00S格式的字符串时间以存储游戏最佳用时?
不用逐个字符解析,快速比较"00H:00M:00S"格式时间字符串的方案
嘿,针对你的需求,我整理了几个简单高效的方案,完全不用拆分字符就能实现时间比较,还能保留你想要的字符串显示格式:
方案1:利用固定格式字符串的字典序特性
这是最省心的方法——只要你的时间字符串严格遵循固定长度的格式(每个时间部分都是两位,不足补前导0,比如1小时2分3秒必须写成01H:02M:03S,而不是1H:2M:3S),直接用字符串的比较运算符就能判断时间长短。
因为这种格式的字符串,字典序和时间的实际大小是完全一致的:
- 小时位先比较,数字大的时间更长
- 小时相同则比分钟,以此类推
比如在C#(Unity常用语言)里,判断当前时间是否比已存的最佳时间更短,可以直接写:
string currentTime = "00H:59M:58S"; string bestTime = "01H:00M:00S"; // 如果当前时间更小(更快),则更新最佳时间 if (currentTime.CompareTo(bestTime) < 0) { // 保存新的最佳时间到数据库 SaveBestTime(currentTime); }
这个方案的核心要求就是格式绝对统一,每个时间部分必须是两位数字,不能省略前导0。
方案2:同步存储总秒数字符串(兼顾显示和比较)
如果担心格式不小心出错,或者需要更精确的比较(比如包含毫秒),可以在生成显示用的00H:00M:00S字符串时,同步计算总秒数(包含小数)并转成字符串存在数据库里。
这样做的好处是:
- 显示时用你需要的
00H:00M:00S格式 - 比较时直接用总秒数字符串,避免格式依赖
结合你的Unity计时器代码,示例如下:
// 假设secondsCount是你累计的时间(float类型) secondsCount += Time.deltaTime; // 计算各时间部分,生成显示字符串 int hours = Mathf.FloorToInt(secondsCount / 3600); int minutes = Mathf.FloorToInt((secondsCount % 3600) / 60); int seconds = Mathf.FloorToInt(secondsCount % 60); // 用D2保证两位数字,自动补0 string displayTimeStr = $"{hours:D2}H:{minutes:D2}M:{seconds:D2}S"; // 生成总秒数字符串(比如保留两位小数,保证精度) string totalSecondsStr = secondsCount.ToString("F2"); // 更新UI if (timerText != null) { timerText.text = displayTimeStr; } // 比较最佳时间时,用totalSecondsStr string bestTotalSecondsStr = GetBestTotalSecondsFromDB(); if (totalSecondsStr.CompareTo(bestTotalSecondsStr) < 0) { // 保存新的最佳时间(同时保存displayTimeStr和totalSecondsStr) SaveBestTime(displayTimeStr, totalSecondsStr); }
总秒数字符串的字典序和数值大小是一致的,所以直接用CompareTo方法就能快速判断。
注意事项
- 如果你需要毫秒级精度,只需要把显示格式改成
00H:00M:00S:000MS,同样保证每个部分固定长度,方案1依然有效;或者在总秒数里保留更多小数位(比如F3)。 - 无论用哪种方案,都要确保存储到数据库的时间字符串格式完全统一,避免出现长度不一致的情况(比如
01H:2M:03S这种格式会导致字典序比较错误)。
内容的提问来源于stack exchange,提问作者Koda
相关产品推荐
相关产品推荐

