日期"字符串"比较大小 "2021-05-08" < "2021-08-09"

"2021-05-08" < "2021-05-09"
// true

"2021-05-08" <= "2021-05-08"
// true

"2021-05-08" < "2021-05-07"
// fasle

请问是怎么比较的

阅读 7.5k
8 个回答

最简单的转换成数字不就可以比较了

const a = '2021-05-08'
const b = '2021-05-09'
function toNum(date) {
  return date.replaceAll('-', '')
}

toNum(a) > toNum(b)

或者Date 日期转换一下也行 都一样的

new Date('2021-05-08').valueOf() < new Date('2021-05-07').valueOf()
+'2021-05-08'.split('-').join('') < +'2021-05-07'.split('-').join('')
+'2021-05-08'.replaceAll('-','') < +'2021-05-07'.replaceAll('-','')

比较的时候,从字符串左边开始,依次比较每个字符,直接出现差异、或者其中一个串结束为止。
比如ABC与ACDE比较,第一个字符相同,继续比较第二个字符,由于第二个字符是后面一个串大,所以不再继续比较,结果就是后面个串大。
再如ABC与ABC123比较,比较三个字符后第一个串结束,所以就是后面一个串大。
所以,长度不能直接决定大小,字符串的大小是由左边开始最前面的字符决定的。

本质是字符串比较,从左到右按位比较每个字符串的ascii值,标准的时间字符串有0补位,比如1月份是01,会小于12月,所有这样比较也基本得到正确结果,前提是有一个标准的时间字符串。

从左到右,依次判断,有一个值大,那就是大
如果前面一致,在出现特殊符号的时候,将特殊符号转换成ASCII码,然后根据ASCII码的值再来进行比较,如果ASCII码值大,那就是大。

具体示例:

'1234-1234-1234' > '1234+333234.1234'
// true
'1234-1234-1234' > '1235+333234.1234'
// false
'1234-1234-1234' > '1235-333234-1234'
// false
'1234-1234-1234' > '1234+1234-1234'
// true
'1234-1234-1234' > '1234/1234-1234'
// false
剖析:
'+' 的 ASCII码值是:43
'-' 的 ASCII码值是:45
'/' 的 ASCII码值是:47

具体参照:ASCII码对照表

后端最好返回“datatime 类型,而不是timestamp,这种数据格式大小有限”,数据格式统一;前端根据需求把时间戳转换为需要展示的格式即可

新手上路,请多包涵

可以把时间转成时间戳再对比

new Date('2021-05-08').getTime() < new Date('2021-05-07').getTime()
Date.parse('2021-05-08')这个方法可以返回距某个时间的毫秒数,然后以此来比较大小
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏