JavaScript解析日期字符串得到前一天23点,致过滤系统异常
解决日期字符串转换错误的问题
这个日期转换的坑我太熟了!让我帮你彻底搞定它,先拆解问题根源,再给你靠谱的解决方案。
问题到底出在哪?
你的代码里有两个致命问题,直接导致了日期转换异常:
- 非标准日期格式的解析歧义:你把拆分后的日期拼成了
2018-05/06这种混合分隔符的字符串,这根本不是浏览器能稳定解析的标准格式。不同环境对这种非标准字符串的解析逻辑完全不可控,很容易出问题。 - 时区偏移的影响:你得到的时间戳对应
2018年5月5日23:00:00,本质是因为浏览器错误地把这个奇怪的字符串解析成了UTC时区的2018-05-06 00:00:00,转换到你的本地时区(比如UTC+1)就变成了前一天的23点。
靠谱的解决方案
方法一:直接用Date构造函数的参数(最推荐)
完全跳过字符串解析的环节,直接把年、月、日作为参数传给Date。注意:Date的月份参数是从0开始的(1月对应0,6月就对应5),所以要给月份减1:
var d = "06/05/2018".split("/"); // 年、月(减1)、日依次传入 var date = new Date(d[2], d[0]-1, d[1]).getTime(); console.log(date); // 这会得到2018年6月5日00:00:00的本地时间戳,完全符合预期
这种方式没有任何解析歧义,是最稳妥的处理方式——不管你从输入框拿到的是$('#min').val()还是其他格式固定的日期字符串,都能用这个逻辑处理。
方法二:拼接成标准ISO格式(备选)
如果你一定要用字符串解析,那就必须拼成标准的ISO 8601格式(比如YYYY-MM-DDTHH:mm:ss),让浏览器能明确识别:
var d = "06/05/2018".split("/"); // 补零确保两位数字,拼成标准格式 var isoDateStr = `${d[2]}-${d[0].padStart(2, '0')}-${d[1].padStart(2, '0')}T00:00:00`; var date = new Date(isoDateStr).getTime();
不过这种方式还是要注意时区问题,如果需要UTC时间,可以在末尾加Z(比如2018-06-05T00:00:00Z),否则会默认用本地时区。
额外提醒
处理输入框的日期时,一定要先确认输入值的格式是稳定的(比如始终是MM/DD/YYYY),然后用上面的方法一处理,就能彻底避免日期范围过滤系统的异常了。
内容的提问来源于stack exchange,提问作者Shiv
相关产品推荐
相关产品推荐

