Mirth转换器中如何判断段字段为日期/时间并移除该段?
在Mirth转换器中判断日期/时间字段并移除对应段落
问题根源
直接用isNaN()判断行不通,因为isNaN()仅检查值是否为NaN,但日期字符串转数字的逻辑和实际是否为有效日期不匹配——比如部分格式不规范的字符串可能被Date构造函数强行解析成某个时间,合法的日期格式(如带横杠的yyyy-MM-dd)直接转数字也可能出现意外结果。
可行实现方案
1. 编写有效日期/时间判断工具函数
在Mirth转换器中先定义一个函数,精准校验输入值是否为有效日期/时间:
function isValidDateTime(value) { if (!value || typeof value !== 'string') { return false; } const date = new Date(value); // 核心判断:确保是有效Date对象,且解析结果和原始值的日期部分匹配(避免纯数字被误判) return date instanceof Date && !isNaN(date) && date.toISOString().startsWith(value.slice(0, 10)); }
函数逻辑说明:
- 先排除空值、非字符串类型的无效输入
- 用
new Date()解析值,通过!isNaN(date)判断是否为有效时间 - 最后加字符串前缀匹配,避免
"1620000000"这类纯数字被误判为日期,不需要的话可删除该条件
2. 在转换器中调用函数并移除目标段落
以HL7消息的OBX段为例,遍历并移除值为日期/时间的段落:
// 获取所有OBX段 var obxSegments = msg.OBX; // 倒序遍历(避免删除元素后索引错乱导致漏处理) for (var i = obxSegments.length - 1; i >= 0; i--) { var fieldValue = obxSegments[i]['OBX.5']['OBX.5.1'].toString(); if (isValidDateTime(fieldValue)) { // 删除该段 delete obxSegments[i]; } }
如果是XML等其他格式消息,逻辑一致:找到目标字段值,调用isValidDateTime判断,符合条件则删除对应父节点。
3. 特定日期格式的精准校验优化
如果业务中日期/时间有固定格式(如yyyy-MM-dd HH:mm:ss),可结合正则先做格式校验,再用Date解析,准确性更高:
function isValidDateTime(value) { if (!value || typeof value !== 'string') { return false; } // 匹配常见格式:yyyy-MM-dd、yyyy-MM-dd HH:mm:ss、HH:mm:ss const dateRegex = /^\d{4}-\d{2}-\d{2}$|^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$|^\d{2}:\d{2}:\d{2}$/; if (!dateRegex.test(value)) { return false; } const date = new Date(value); return !isNaN(date); }
注意事项
- 必须倒序遍历数组:正序删除元素会导致后续元素索引移位,漏处理部分数据
- 强制类型转换:确保拿到的字段值是字符串类型,避免Mirth节点类型导致判断出错
- 格式适配:根据实际业务的日期/时间格式调整正则或判断逻辑,比如系统用
MM/dd/yyyy格式时要修改正则
内容的提问来源于stack exchange,提问作者SteveL
相关产品推荐
相关产品推荐

