我在默认的2.3架构中看到TS
和DT
数据类型:
<SegmentStructure name='SMPL' description='Patient Identification'>
<SegmentSubStructure piece='1' description='A sample datetime field' datatype='DT' max_length='12' required='O' ifrepeating='0'/>
</SegmentStructure>
<DataType name='TS' description='time stamp'>
<DataSubType piece='1' description='time of an event' datatype='ST'/>
<DataSubType piece='2' description='degree of precision' datatype='ST'/>
</DataType>
<DataType name='DT' description='Date (2.8.13)'>
<DataSubType piece='1' description='Date (2.8.13)'/>
</DataType>
但它似乎并没有真正验证格式。这可能吗?我们最近有一个实例,客户正在发送一个缺少数字的时间戳(例如20160503120)。如果可以的话,我想用架构验证这一点。
修改 希望添加一些澄清
我们使用intersystems-healthshare,当ADT进入时,它会通过扩展名为.hl7
的验证程序。默认情况下,这是2.3.hl7
或类似的(取决于版本)。它看起来就像上面的代码。我想知道我是否可以以某种方式将正则表达式放在那里。在段结构定义(SMPL)或数据类型定义中。
答案 0 :(得分:1)
v2文档有这样美:
YYYY[MM[DD[HH[MM[SS[.S[S[S[S]]]]]]]]][+/-ZZZZ]
括号表示可选部分。也许只看一下断点?像这样的东西?假设您首先拆分时区,然后将其传递给您实际用于解析日期的任何内容。
switch (datePart.length) {
case 4:
return parseDate(datePart, "YYYY");
case 6:
return parseDate(datePart, "YYYYMM");
case 8:
return parseDate(datePart, "YYYYMMDD");
case 10:
return parseDate(datePart, "YYYYMMDDHH");
case 12:
return parseDate(datePart, "YYYYMMDDHHmm");
case 14:
return parseDate(datePart, "YYYYMMDDHHmmss");
case 16:
return parseDate(datePart, "YYYYMMDDHHmmss.S");
case 17:
return parseDate(datePart, "YYYYMMDDHHmmss.SS");
case 18:
return parseDate(datePart, "YYYYMMDDHHmmss.SSS");
default:
return undefined;
}
答案 1 :(得分:0)
您可以向架构添加正则表达式。这是来自v3模式的完整TS正则表达式:
[0-9] {1,8} |([0-9] {9,14} |。[0-9] {14,14} [0-9] +)([+ - ] [ 0-9] {1,4})?
答案 2 :(得分:0)
根据HL7 v2的规范(见http://www.hl7.eu/refactored/dtDTM.html),DT的格式为:YYYY [MM [DD [HH [MM [SS [.S [S [S [S]]]]] ]]]] [+/- ZZZZ]。
因此,正确的正则表达式将是:
^((\d{2}){2,7}|\d{14}.\d{1,4}([+-]\d{4})?)$
但是,如果您正在谈论TS数据类型,它可能包括插入符号和精度指示符。
在这种情况下,正则表达式可能是:
^((\d{2}){2,7}|\d{14}.\d{1,4}([+-]\d{4})?)(\^[YLDHMS])?$
这只是第一次筛选,因为实际日期/时间值未经过验证。