在写 Ruby 代码的时候,经常会遇到需要比较字符串的场景。我相信遇到的最多的就是看两个字符串是否相等了
str1 == str2
这种情况只要长度和内容相等就会返回true
而有些时候遇到的情况比较特殊,像是这样的字符串“20170101”, “20170113”,或者是“2017-01-01”, “2017-01-13”
这些字符串一看就是代表的时间,而我们业务上也是需要比较出两个时间的大小。这个时候你可能会将字符串 parse 为Time
或者是DateTime
类型,然后再比较。
但是这比较麻烦,所以会考虑直接将字符串进行比较如何:
[42] pry(main)> "20170101" < "20170113"
=> true
[43] pry(main)> "2017-01-01" < "2017-01-13"
=> true
从结果来看这两个 case 都是正确的结果。但是背后的原理究竟是什么呢,其他的 case 是不是一样的 work 呢?
大家觉得下面这个 case 的结果如何?
"20121110" > "201210100"
也许会出乎你的预料,结果是true
。
[27] pry(main)> "20121110" > "20120110000000"
=> true
这个也是true
。这是不是让你侥幸的认为他们就是在比较str.to_i
之后的大小的心理受到了一万点伤害。
其实字符串比较,并没有对字符串做任何的转换,比较的就是字符串。但是除了比较长得一不一样,还有什么可比的呢? 长得像不像是你的眼睛做的比较,计算机比较的是字符编码
对于字符串的比较:
A: 如果长度一样,那么从第一个开始比较,当遇到不一样的字符时,哪个字符串对应的字符的编码值大,就谁大。
B: 如果长度不一样,并且较长字符串的前面部分跟短的字符串相同,那么算是长的字符串大。
C: 如果长度不一样,并且较长字符串的前面部分跟短的字符串不同,那么按照规则 A 比较。
所以回到比较两个时间的 case,你可以直接通过字符串比较,但是切记保证时间的格式一致,长度一致,否则得到的可能不是你想要的结果。
如有错误,欢迎指正!