in FixAntenna/NetCore/Message/FixTypes.cs [1525:1600]
private static DateTimeOffset parseTZTimeOnlyPart(byte[] buffer, int offset, int length)
{
var hour = ParseNumberPart(buffer, offset, offset + 2);
if (hour < 0 || hour > 23)
{
throw new ArgumentException();
}
// Starting from year 2 to prevent ArgumentOutOfRangeException in case when current time inside offset.
var timeBuilder = new DateTimeBuilder(2, 1, 1);
timeBuilder = timeBuilder.SetHour(hour);
var minute = ParseNumberPart(buffer, offset + 3, offset + 5);
if (minute < 0 || minute > 59)
{
throw new ArgumentException();
}
timeBuilder = timeBuilder.SetMinute(minute);
var timeZoneLength = length - 5;
if (length > 5 && buffer[offset + 5] == (byte)':')
{
// seconds
var seconds = ParseNumberPart(buffer, offset + 6, offset + 8);
if (seconds < 0 || seconds > 60)
{
throw new ArgumentException();
}
timeBuilder = timeBuilder.SetSecond(seconds);
timeZoneLength -= 3;
if (length > 8 && buffer[offset + 8] == (byte)'.' && length + offset > 5)
{
// milliseconds
var mills = ParseNumberPart(buffer, offset + 9, offset + 12);
if (mills < 0 || mills > 999)
{
throw new ArgumentException();
}
timeBuilder = timeBuilder.SetMillisecond(mills);
timeZoneLength -= 4;
var fractionsCount = 3; // as minimum milliseconds are present
for (var i = 12; i < length; i++)
{
if (buffer[offset + i] >= (byte)'0' && buffer[offset + i] <= (byte)'9')
{
fractionsCount++;
}
else
{
break;
}
}
if (fractionsCount == 6)
{
timeZoneLength -= 3;
}
else if (fractionsCount == 9)
{
timeZoneLength -= 6;
}
else if (fractionsCount != 3)
{
throw new ArgumentException("Invalid count of second fractions");
}
}
}
var tzStartPosition = offset + length - timeZoneLength;
var timeZoneOffset = DateTimeHelper.ParseZoneOffset(buffer, tzStartPosition, timeZoneLength);
return timeBuilder.Build(timeZoneOffset);
}