QB Time Tracking WebService时长XML节点转换结果不符预期技术问询
看起来你在给QuickBooks传时长数据时踩了个格式的坑——明明传了PT0H14M0S(对应14分钟),结果QB却显示0,和你预期的0.14(这里我猜你可能混淆了分钟数与小时小数的转换逻辑?14分钟实际对应≈0.233小时,0.14小时其实是8.4分钟)不符。我来帮你拆解下问题和解决办法:
核心问题:QuickBooks对Duration字段的格式要求
你用的是ISO 8601标准的时长格式PT0H14M0S,但QuickBooks的QBXML接口在处理TimeTracking类请求时,并不是所有版本都支持这种格式。大部分场景下,它期望的是直接传入小数形式的小时数,而非ISO时长字符串。这就是你的PT0H14M0S被解析成0的原因——QB无法识别该格式,直接默认赋值为0了。
解决办法分这几步:
1. 直接传递小数小时数(最稳妥方案)
把你要传递的分钟数转换成对应的小时小数,比如14分钟就是14 / 60 ≈ 0.2333,然后将这个值赋值给Duration节点:
XmlElement duration2 = inputXmlDoc.CreateElement("Duration"); timeTrackingAdd2.AppendChild(duration2); // 14分钟转成小时小数,保留4位精度 duration2.InnerText = (14.0 / 60).ToString("0.0000");
这样QB就能正确识别并显示对应的时长。如果你的预期0.14是真的要传递0.14小时(约8分钟),直接传0.14即可。
2. 确认QBXML版本是否支持ISO时长格式
如果你坚持想用ISO 8601格式,需要先核对你使用的QBXML版本文档。比如QBXML v13.0及以后的部分版本可能开始支持ISO时长,但旧版本(如v10.0之前)完全不支持。若版本确实支持,排查下格式写法是否严格匹配(比如PT必须大写、无多余空格)。
3. 检查TimeTrackingAdd请求的完整性
如果请求中缺少TxnDate、EntityRef、ItemRef等必填字段,QB可能会忽略Duration字段,导致显示异常。建议对照QBXML参考手册,确认请求结构是否完整。
补充:关于你预期的0.14
这里提一句,14分钟对应的小时小数是≈0.233,而0.14小时等于8.4分钟。如果你确实想得到0.14的显示结果,应该传递的是8.4分钟对应的时长,而非14分钟。可能这里你混淆了分钟数与小时小数的转换逻辑,需要先明确实际需求哦。
内容的提问来源于stack exchange,提问作者ARr0w

