一、处理时间格式
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");
更多不同格式之间转化,可以看我之前一篇笔记:
(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;
}