INET Nordic FIX 协议扩展到纳秒粒度时间戳
INET Nordic FIX protocols extending to nanosecond granularity timestamps
所有 INET Nordic FIX 协议都将通过在 16.oktober 2015 (see notification and section 3.1.1 in the spec) 上扩展到纳秒粒度时间戳得到增强。
时间戳将如下所示:20150924-10:35:20.840117690
quickfix 当前拒绝包含具有此新格式的字段的邮件,并出现错误:值的数据格式不正确
是否有计划支持这种新格式?或者可能有一些解决方法?
您可以先尝试修改您的数据字典。例如,如果您使用的是 QuickFIX 附带的 fix42.xml
,则可以将受影响的时间戳字段从 type='UTCTIMESTAMP'
更改为 type='STRING'
。
如果这还不够,您应该改用 C++ 编写针对 QuickFIX 的补丁,一旦您知道在哪里打补丁,这应该会比较简单,我认为是 UtcTimeStampConvertor
,在这里:https://github.com/quickfix/quickfix/blob/master/src/C%2B%2B/FieldConvertors.h#L564
我认为您需要在靠近顶部的 case 21:
上方添加一个 case 27:
,因为您的格式有六个额外的数字。看起来函数的其余部分并不关心总字段长度。
当然,如果你想真正检查这些时间戳的亚毫秒精度部分,你需要做更多。
QF/n 没有计划,只是因为这是我第一次听说这个。
我需要编写一些测试来查看会产生什么影响。可能是 time/date 解析器在将字符串转换为 DateTime 时只是截断了多余的 nano 位置。
据我所知,此更改有点破坏了时间戳的修复协议定义,但那是另一回事了。
QuickFixn 中有一个名为 DateTimeConverter 的静态 class 在 QuickFix/Fields/Converters 下。
要使其正常工作,您需要在 class.
的行中添加格式字符串
将 "yyyyMMdd-HH:mm:ss.fffffff" 添加到 DATE_TIME_FORMATS 并将 "HH:mm:ss.fffffff" 添加到 TIME_ONLY_FORMATS 以便它看起来像这样。
/// <summary>
/// Convert DateTime to/from String
/// </summary>
public static class DateTimeConverter
{
public const string DATE_TIME_FORMAT_WITH_MILLISECONDS = "{0:yyyyMMdd-HH:mm:ss.fff}";
public const string DATE_TIME_FORMAT_WITHOUT_MILLISECONDS = "{0:yyyyMMdd-HH:mm:ss}";
public const string DATE_ONLY_FORMAT = "{0:yyyyMMdd}";
public const string TIME_ONLY_FORMAT_WITH_MILLISECONDS = "{0:HH:mm:ss.fff}";
public const string TIME_ONLY_FORMAT_WITHOUT_MILLISECONDS = "{0:HH:mm:ss}";
public static string[] DATE_TIME_FORMATS = { "yyyyMMdd-HH:mm:ss.fffffff", "yyyyMMdd-HH:mm:ss.fff", "yyyyMMdd-HH:mm:ss" };
public static string[] DATE_ONLY_FORMATS = { "yyyyMMdd" };
public static string[] TIME_ONLY_FORMATS = { "HH:mm:ss.fffffff", "HH:mm:ss.fff", "HH:mm:ss" };
public static DateTimeStyles DATE_TIME_STYLES = DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal;
public static CultureInfo DATE_TIME_CULTURE_INFO = CultureInfo.InvariantCulture;
所有 INET Nordic FIX 协议都将通过在 16.oktober 2015 (see notification and section 3.1.1 in the spec) 上扩展到纳秒粒度时间戳得到增强。
时间戳将如下所示:20150924-10:35:20.840117690
quickfix 当前拒绝包含具有此新格式的字段的邮件,并出现错误:值的数据格式不正确
是否有计划支持这种新格式?或者可能有一些解决方法?
您可以先尝试修改您的数据字典。例如,如果您使用的是 QuickFIX 附带的 fix42.xml
,则可以将受影响的时间戳字段从 type='UTCTIMESTAMP'
更改为 type='STRING'
。
如果这还不够,您应该改用 C++ 编写针对 QuickFIX 的补丁,一旦您知道在哪里打补丁,这应该会比较简单,我认为是 UtcTimeStampConvertor
,在这里:https://github.com/quickfix/quickfix/blob/master/src/C%2B%2B/FieldConvertors.h#L564
我认为您需要在靠近顶部的 case 21:
上方添加一个 case 27:
,因为您的格式有六个额外的数字。看起来函数的其余部分并不关心总字段长度。
当然,如果你想真正检查这些时间戳的亚毫秒精度部分,你需要做更多。
QF/n 没有计划,只是因为这是我第一次听说这个。
我需要编写一些测试来查看会产生什么影响。可能是 time/date 解析器在将字符串转换为 DateTime 时只是截断了多余的 nano 位置。
据我所知,此更改有点破坏了时间戳的修复协议定义,但那是另一回事了。
QuickFixn 中有一个名为 DateTimeConverter 的静态 class 在 QuickFix/Fields/Converters 下。
要使其正常工作,您需要在 class.
的行中添加格式字符串将 "yyyyMMdd-HH:mm:ss.fffffff" 添加到 DATE_TIME_FORMATS 并将 "HH:mm:ss.fffffff" 添加到 TIME_ONLY_FORMATS 以便它看起来像这样。
/// <summary>
/// Convert DateTime to/from String
/// </summary>
public static class DateTimeConverter
{
public const string DATE_TIME_FORMAT_WITH_MILLISECONDS = "{0:yyyyMMdd-HH:mm:ss.fff}";
public const string DATE_TIME_FORMAT_WITHOUT_MILLISECONDS = "{0:yyyyMMdd-HH:mm:ss}";
public const string DATE_ONLY_FORMAT = "{0:yyyyMMdd}";
public const string TIME_ONLY_FORMAT_WITH_MILLISECONDS = "{0:HH:mm:ss.fff}";
public const string TIME_ONLY_FORMAT_WITHOUT_MILLISECONDS = "{0:HH:mm:ss}";
public static string[] DATE_TIME_FORMATS = { "yyyyMMdd-HH:mm:ss.fffffff", "yyyyMMdd-HH:mm:ss.fff", "yyyyMMdd-HH:mm:ss" };
public static string[] DATE_ONLY_FORMATS = { "yyyyMMdd" };
public static string[] TIME_ONLY_FORMATS = { "HH:mm:ss.fffffff", "HH:mm:ss.fff", "HH:mm:ss" };
public static DateTimeStyles DATE_TIME_STYLES = DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal;
public static CultureInfo DATE_TIME_CULTURE_INFO = CultureInfo.InvariantCulture;