unity功能——处理string格式的Time,并判断时间先后

本文介绍了如何将时间字符串如'2021/12/30 17:59:25'转换为整数列表,并详细阐述了转换过程,包括正则表达式替换、字符串切割、字符判空转化和字符转数字。此外,还讲解了如何通过比较整数列表来判断两个时间的先后顺序,主要依据列表中对应位置的数值大小。提供完整的C#代码实现这两个功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、处理时间格式

1、时间格式
(1)输入:string
string:“2021/12/30 17:59:25”;
(2)输出:List<int>()
List<int>():{2021,12,30,17,59,25,00};
2、方法思路
(1)正则表达式:Regex类

        将string里的空格转为常见无干扰字符“,”;

(2)字符串替换:string.Replace()

根据时间格式,将(“/“,“:”,“am”等)非数字相关的字符删去,或替换为“,”:

使用string.Replace(char A,char B),将字符串里的A字符替换为B字符;

a = a.Replace("/", ",");//斜杠替换为逗号

a = a.Replace("am", "");//删除am字符
(3)字符串切割:string.Split()
1)string.Split('分割字符')

将字符串按指定要求进行分割成多个字段,并将分割后的字符放进数组中;

//将a字符串,根据字符串里的“,”为分割点分割
string[] newA = a.Split(',');
2)注意分割后可能存在的空白字符
若:a ="123,456,"   

则:newA ={123,456,};        //数组中3个元素:{123},{456},{};

a根据逗号切割,最后“456,”,这里会分割成逗号前  456  和逗号后  空字符 两个元素;

(4)字符判空转化

判断字符是否为空,并将空格字符转化为不干扰数字大小的“00”;

string.IsNullOrEmpty(“字符串”),返回bool值;

string newA =“”;

if (string.IsNullOrEmpty(newA)) newA = "00";
(5)字符转数字;

这里字符都是整数,比较简单直接转化为int类型:

int x = int.Parse("8");

更多不同格式之间转化,可以看我之前一篇笔记:

C# 数据处理——(包括但不限)浮点数设置小数点后位数

(6)遍历数组,将string数组,转化为List<int>;
3、完整功能方法代码
    /// <summary>
    /// 处理string类型的time,并获得其int类型的list
    /// </summary>
    /// <param name="a">time格式:“2021/12/30 17:59:25”</param>
    /// <returns>返回格式“[2021,12,30,17,59,25]”</returns>
    private List<int> GetTimeList(string a)
    {
        List<int> listValue = new List<int>();
        a = Regex.Replace(a, @"\s", ",");//空格转换为“,”
        a = a.Replace(":", ",");
        a = a.Replace("/", ",");
        //a = a.Replace("am", "");//删除am字符
        string[] newA = a.Split(',');
        for (int i = 0; i < newA.Length; i++)
        {
            int index = i;
            if (string.IsNullOrEmpty(newA[index])) newA[index] = "00";
            listValue.Add(int.Parse(newA[index]));
        }
        return listValue;
    }

二、判断时间先后

string类型时间,转化为List<int>,列表里不同位置的占比不同;

可比较List<int>里同下标的数字大小,判断时间先后

1、原理

(1)越靠近列表前面的数字越大,越接近最近时间、时间最新/最晚;

(2)这里精确到秒,判断时间先后时,基本不担心会有重复相同的。

比如:          2021/12/30 17:59:25”;       “2019/8/25 16:19:22”;        “2019/8/25 16:39:22”;

对应list:    {2021,12,30,17,59,25,00},   {2019,8,25,16,19,22,00},   {2019,8,25,16,39,22,00}

 {2021,12,30,17,59,25,00}        与         {2019,8,25,16,19,22,00}        比较,

index=0位置上一个是2021,一个是2019,直接判断2021的时间晚于2019;

{2019,8,25,16,19,22,00}           与        {2019,8,25,16,39,22,00}        比较;

前面年月日时对应的时间数字都相同{2019,8,25,16,},在分钟上,19小于39,可判断时间先后。

2、方法思路
(1)基于上面将时间字符串转化为数字列表;
(2)从前往后比较数字List<int>对应下标的数字大小;

只要判断出某个列表的值大于或小于另一个同下标里数字,即可判断出两个时间的先后顺序,数字大的时间对应于时间更晚;

1)先判断比较的两个时间对应的列表长度是否相同,不相同则以短的列表长度为之后遍历次数;

2)循环遍历同下标的两个list里的值是否相等;

(3)返回比较结果:true/false;
3、完整功能方法代码
    /// <summary>
    /// 判断时间a、b先后,时间是否先于b
    /// </summary>
    /// <param name="a">字符串a</param>
    /// <param name="b">字符串b</param>
    /// <returns></returns>
    private bool CompareString(string a, string b)
    {
        int isCompare = 0;
        List<int> aList = GetTimeList(a);
        List<int> bList = GetTimeList(b);
        int len = aList.Count <= bList.Count ? aList.Count : bList.Count;
        for (int i = 0; i < len; i++)
        {
            int index = i;
            if (aList[index] > bList[index]) isCompare = 1;
            if (aList[index] < bList[index]) isCompare = -1;
            if (isCompare != 0) break;
        }
        return (isCompare == -1) ? false : true;
    }

### 实现玩家胜利时的游戏结束时间计算 为了在 Unity 游戏中精确记录玩家获胜的时间,可以创建一个计时器系统。此系统会在游戏开始时启动,在满足特定条件(例如所有敌人被击败或达到目标位置)时停止,显示最终经过的时间。 #### 创建计时器逻辑 可以在 `GameManager` 类中管理这一过程,因为此类通常负责处理全局状态变化和事件触发[^1]。下面展示一段 C# 脚本作为示例: ```csharp using UnityEngine; using System.Collections; public class GameManager : MonoBehaviour { private float startTime; // 记录游戏开始时刻 void Start() { startTime = Time.time; // 初始化起始时间为当前时间戳 } public string GetElapsedTime() { float elapsedTime = Time.time - startTime; // 获取自游戏开始以来流逝的时间 int minutes = Mathf.FloorToInt(elapsedTime / 60); // 将秒转换成分钟部分 int seconds = Mathf.FloorToInt(elapsedTime % 60); // 取余数得到剩余的秒数 return string.Format("{0:D2}:{1:D2}", minutes, seconds); } } ``` 上述代码片段展示了如何初始化定时器以及获取已过去的时间长度。每当调用 `GetElapsedTime()` 方法时都会返回格式化后的字符串形式的时间差值[^2]。 #### 显示胜利时间处理胜利条件 当检测到玩家赢得比赛的情况发生时——比如消灭了所有的敌人或者完成了某个特殊任务,则应该立即保存此刻的时间更新UI界面告知玩家成绩。这可以通过监听相应的事件完成,假设有一个方法叫做 `OnPlayerWin()` 来响应胜利情况的发生: ```csharp void OnPlayerWin(){ Debug.Log("Congratulations! You have won the game."); string finalTime = GetElapsedTime(); // 得到最后的成绩 UIController.ShowVictoryScreen(finalTime); // 更新UI控件上的文字内容为最后得分 } ``` 这里的 `UIController.ShowVictoryScreen(string)` 是假定存在的函数用来刷新用户界面上的信息,实际应用中可能需要根据具体的设计调整这部分实现方式[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值