如何正确比较两个DateUtil转换后的日期对象是否为同一天?
问题分析与解决方案
你遇到的核心问题有两个:
- 日期转换源格式错误:
start的原始字符串是20230811125910(含时分秒),但你用了yyyyMMdd作为源格式转换,导致DateUtil仅解析前8位,后续时间部分处理不符合预期。 - 直接比较完整日期时间:即使转换正确,
labOrderTime对应当天00:00:00,start对应当天12:59:10,直接比较会认为前者更早,无法判断是否为同一天。
修正步骤与解决方案
1. 先修正日期转换的源格式
把start的转换格式改成匹配的yyyyMMddHHmmss,确保解析出正确的日期时间:
var labOrderTime = '20230811' labOrderTime = DateUtil.convertDate('yyyyMMdd', 'yyyy-MM-dd HH:mm:ss', labOrderTime) // 转成带时分秒的格式,方便后续统一处理 var start = '20230811125910' start = DateUtil.convertDate('yyyyMMddHHmmss', 'yyyy-MM-dd HH:mm:ss', start) // 用正确的源格式解析完整时间
2. 实现"判断是否为同一天"的逻辑
以下是几种可靠的实现方式:
方式一:转换为纯日期字符串比较
将两个日期都转成yyyy-MM-dd格式的字符串,直接比对字符串是否相等:
// 提取纯日期部分 const labOrderDateStr = DateUtil.convertDate('yyyy-MM-dd HH:mm:ss', 'yyyy-MM-dd', labOrderTime) const startDateStr = DateUtil.convertDate('yyyy-MM-dd HH:mm:ss', 'yyyy-MM-dd', start) if (labOrderDateStr === startDateStr) { return 1 // 同一天 } // 如需判断日期先后,转成时间戳比较 const labOrderTimestamp = new Date(labOrderDateStr).getTime() const startTimestamp = new Date(startDateStr).getTime() if (labOrderTimestamp < startTimestamp) { return 2 // labOrderTime日期更早 } else { return 3 // labOrderTime日期更晚 }
方式二:提取年、月、日属性比较
将日期字符串转为原生Date对象,直接比对年、月、日三个核心属性:
const labOrderDate = new Date(labOrderTime) const startDate = new Date(start) // 判断是否为同一天 const isSameYear = labOrderDate.getFullYear() === startDate.getFullYear() const isSameMonth = labOrderDate.getMonth() === startDate.getMonth() const isSameDay = labOrderDate.getDate() === startDate.getDate() if (isSameYear && isSameMonth && isSameDay) { return 1 } // 日期先后判断 if (labOrderDate.getTime() < startDate.getTime()) { return 2 } else { return 3 }
方式三:利用工具类内置方法(如果有)
如果你的DateUtil提供了判断同一天的工具方法(比如isSameDay),可以直接调用:
if (DateUtil.isSameDay(labOrderTime, start)) { return 1 } // 后续日期先后判断逻辑同上
原代码返回2的原因
labOrderTime转换后对应2023-08-11 00:00:00,而start即使转换格式错误,最终解析出的日期时间也会晚于当天0点,直接比较时labOrderTime < start成立,因此返回2。
内容的提问来源于stack exchange,提问作者D. Fowler
相关产品推荐
相关产品推荐

