You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:34:04