昨晚,做一个算法就是在一个固定格式的日期+时间的字符串中取出自己想要的字符或子字符串,我的目标是取到小时数,然后根据取出来的东西继续挖掘数据。
存储在数据库中的日期+时间的字符串格式:
yyyy-m(1个或2个)-d(1个或2个) hh:mm:ss
举几个相应的例子:
2014-4-4 12:10:55(2014年4月4号12点10分55秒)
2014-12-4 08:10:45
2014-4-12 10:10:05
2014-12-12 08:08:08
大家可以看出前面的日期长度是不固定的,而后面的时间显示长度是固定的,而且日期跟时间之间有一个空格
在写之前,其实自己已经有相应的构思了,本以为能很快的写出来,哪曾想,其间意外不断。
下面是我最后成型的代码算法:
(主要的流程是先依据空格用lastindexof()函数取出空格所在的位置,有了空格的位置便可以再通过substring函数空格后的两个数,即小时数)
public double[] aa() { int d = 0; int e = 0; int f = 0; double[] g = new double[3]; int rows = ds.Tables[0].Rows.Count; for (int i = 0; i < rows;i++ ) { string a = ds.Tables[0].Rows[i]["createTime"].ToString(); int b = a.Length; int c = a.LastIndexOf(" ",b);//以空格作为切入口 int j =int.Parse(a.Substring(c+1,2));//取子字符串 if(j>=7&j<9) { d++; } else if(j>=10&j<13) { e++; } else if(j>=1&j<3) { f++; } } g[0] = d * 1.0 / rows;//*1.0这个超级重要,要不然调试半天都不知道哪里错的 g[1] = e * 1.0 / rows; g[2] = f * 1.0 / rows; return g; }
以上代码变量命名不是很规范,因为当时很赶时间,所以就用a,b,c,d之类的先定义变量的。
1.我要取三个时间段并且算出在3个时间段出现的次数(d,e,f)在总次数(rows)里面占的比重。所以函数的返回类型应该定义为什么呢?
DataTable?String?(Array)[]?还是其他的,最终我还是选择了数组,DataTable说实话没用过,没真正搞懂里面的数据结构和其真正使用的场合,string用起来很麻烦,难道最后的结果都是通过+=叠加起来,然后前台再通过string的substring来取子字符串?
2.决定了返回类型,下面就是算法了,for循环没有问题,但是怎么取到小时数是个难题,一直困扰我的是它整个的长度是不固定的,特别是前面日期的月和日的格式不固定,后来感觉真的是笨到家了。
解决方法一:从前面可以通过":"作为切入口,取到第一个":"所在的位置,然后向前进2位就是要的小时数了。
解决方法二:从后面取,同样是通过":"或是通过" "来作为关键突破口。当然从后面取的话,那么":"取到的位置是后面一个冒号的位置,那样就要向前进5位。
其实这边最关键的是以哪一个字符作为切入口,还有就是对string的各种函数的熟悉。
3.最后什么东西都写好了,调试下,结果都是0,因为数据少,正好对应的每一项的d,e,f都是1。所以一步一步debug,发现d,e,f都是有数值的啊,怎么结果是0呢。后来一想是除法机制的问题,在编程中1除以一个数(除去特殊情况)结果都是零,因为结果是0.****,它也只返回零,你用double数据类型也不行。错就错在没加"*0.1"这个金句上,这真的是细节粗心害死人啊。最后改了以后,代码运行无误。
当然以上只是个人的一个小经验,其实写这个代码很多都会写,很多人都可能比我写的方法更简单,但这里我要说的是这个是要提醒自己要注意细节和想问题的全面性的。
当然大家也可以依据这个举一反三,取出自己想要的任何数据。
从日期+时间的格式的字符串中取到自己想要的数值的感想,布布扣,bubuko.com
原文:http://blog.csdn.net/u010792238/article/details/22934857