in FixAntenna/NetCore/Message/FixTypes.cs [570:967]
public static bool isInvalidTZTimeOnly(byte[] buffer, int offset, int count)
{
// Example: 07:39Z is 07:39 UTC
// Example: 02:39-05 is five hours behind UTC, thus Eastern Time
// Example: 15:39+08 is eight hours ahead of UTC, Hong Kong/Singapore time
// Example: 13:09+05:30 is 5.5 hours ahead of UTC, India time
try
{
if (count != 6 && count != 8 && count != 9 && count != 11 && count != 13 && count != 14 &&
count != 15 && count != 16 && count != 18 && count != 19 && count != 21 && count != 24)
{
return true;
}
if (buffer[offset + 2] != (byte)':')
{
return true;
}
// hours
var hour = ParseNumberPart(buffer, offset, offset + 2);
if (hour < 0 || hour > 23)
{
return true;
}
// minute
var minute = ParseNumberPart(buffer, offset + 3, offset + 5);
if (minute < 0 || minute > 59)
{
return true;
}
if (buffer[offset + 5] != (byte)':')
{
// only minutes
switch (count)
{
case 6:
{
//07:39Z
if (buffer[offset + 5] != (byte)'Z')
{
return true;
}
}
break;
case 8:
{
//13:09+05
if (!(buffer[offset + 5] == (byte)'+' || buffer[offset + 5] == (byte)'-'))
{
return true;
}
var tzHour = ParseNumberPart(buffer, offset + 6, offset + 8);
if (tzHour < 1 || tzHour > 12)
{
return true;
}
}
break;
case 11:
{
//07:39+02:31
if (!(buffer[offset + 5] == (byte)'+' || buffer[offset + 5] == (byte)'-'))
{
return true;
}
var tzHour = ParseNumberPart(buffer, offset + 6, offset + 8);
if (tzHour < 1 || tzHour > 12)
{
return true;
}
if (buffer[offset + 8] != (byte)':')
{
return true;
}
var tzMinutes = ParseNumberPart(buffer, offset + 9, offset + 11);
if (tzMinutes < 0 || tzMinutes > 59)
{
return true;
}
}
break;
default:
return true;
}
}
else
{
//as minimum seconds are present
var second = ParseNumberPart(buffer, offset + 6, offset + 8);
if (second < 0 || second > 60)
{
return true;
}
switch (count)
{
case 9:
{
//13:09:30Z
if (buffer[offset + 8] != (byte)'Z')
{
return true;
}
}
break;
case 11:
{
//07:39:30+02
if (!(buffer[offset + 8] == (byte)'+' || buffer[offset + 8] == (byte)'-'))
{
return true;
}
var tzHour = ParseNumberPart(buffer, offset + 9, offset + 11);
if (tzHour < 1 || tzHour > 12)
{
return true;
}
}
break;
case 13:
{
//07:39:30.301Z
if (buffer[offset + 8] != (byte)'.')
{
return true;
}
var mills = ParseNumberPart(buffer, offset + 9, offset + 12);
if (mills < 0 || mills > 999)
{
return true;
}
if (buffer[offset + 12] != (byte)'Z')
{
return true;
}
}
break;
case 14:
{
//07:39:33+02:31
if (!(buffer[offset + 8] == (byte)'+' || buffer[offset + 8] == (byte)'-'))
{
return true;
}
var tzHour = ParseNumberPart(buffer, offset + 9, offset + 11);
if (tzHour < 1 || tzHour > 12)
{
return true;
}
if (buffer[offset + 11] != (byte)':')
{
return true;
}
var tzMinutes = ParseNumberPart(buffer, offset + 12, offset + 14);
if (tzMinutes < 0 || tzMinutes > 59)
{
return true;
}
}
break;
case 15:
{
//07:39:54.101+02
if (buffer[offset + 8] != (byte)'.')
{
return true;
}
var mills = ParseNumberPart(buffer, offset + 9, offset + 12);
if (mills < 0 || mills > 999)
{
return true;
}
if (!(buffer[offset + 12] == (byte)'+' || buffer[offset + 12] == (byte)'-'))
{
return true;
}
var tzHour = ParseNumberPart(buffer, offset + 13, offset + 15);
if (tzHour < 1 || tzHour > 12)
{
return true;
}
}
break;
case 16:
{
//07:39:30.301301Z
if (buffer[offset + 8] != (byte)'.')
{
return true;
}
var micros = ParseNumberPart(buffer, offset + 9, offset + 15);
if (micros < 0 || micros > 999999)
{
return true;
}
if (buffer[offset + 15] != (byte)'Z')
{
return true;
}
}
break;
case 18:
{
//07:39:54.101+02:17
//07:39:54.101101-02
if (buffer[offset + 8] != (byte)'.')
{
return true;
}
if (buffer[offset + 15] == (byte)':')
{
//07:39:54.101+02:17
var mills = ParseNumberPart(buffer, offset + 9, offset + 12);
if (mills < 0 || mills > 999)
{
return true;
}
if (!(buffer[offset + 12] == (byte)'+' || buffer[offset + 12] == (byte)'-'))
{
return true;
}
var tzHour = ParseNumberPart(buffer, offset + 13, offset + 15);
if (tzHour < 1 || tzHour > 12)
{
return true;
}
var tzMinutes = ParseNumberPart(buffer, offset + 16, offset + 18);
if (tzMinutes < 0 || tzMinutes > 59)
{
return true;
}
}
else if (buffer[offset + 15] == (byte)'+' || buffer[offset + 15] == (byte)'-')
{
//07:39:54.101101-02
var micros = ParseNumberPart(buffer, offset + 9, offset + 15);
if (micros < 0 || micros > 999999)
{
return true;
}
var tzHour = ParseNumberPart(buffer, offset + 16, offset + 18);
if (tzHour < 1 || tzHour > 12)
{
return true;
}
}
else
{
return true;
}
}
break;
case 19:
{
//07:39:30.301301301Z
if (buffer[offset + 8] != (byte)'.')
{
return true;
}
var nanos = ParseNumberPart(buffer, offset + 9, offset + 18);
if (nanos < 0 || nanos > 999999999)
{
return true;
}
if (buffer[offset + 18] != (byte)'Z')
{
return true;
}
}
break;
case 21:
{
//07:39:54.101101+02:17
//07:39:54.101101101-02
if (buffer[offset + 8] != (byte)'.')
{
return true;
}
if (buffer[offset + 18] == (byte)':')
{
//07:39:54.101101+02:17
var micros = ParseNumberPart(buffer, offset + 9, offset + 15);
if (micros < 0 || micros > 999999)
{
return true;
}
if (!(buffer[offset + 15] == (byte)'+' || buffer[offset + 15] == (byte)'-'))
{
return true;
}
var tzHour = ParseNumberPart(buffer, offset + 16, offset + 18);
if (tzHour < 1 || tzHour > 12)
{
return true;
}
var tzMinutes = ParseNumberPart(buffer, offset + 19, offset + 21);
if (tzMinutes < 0 || tzMinutes > 59)
{
return true;
}
}
else if (buffer[offset + 18] == (byte)'+' || buffer[offset + 18] == (byte)'-')
{
//07:39:54.101101101-02
var nanos = ParseNumberPart(buffer, offset + 9, offset + 18);
if (nanos < 0 || nanos > 999999999)
{
return true;
}
var tzHour = ParseNumberPart(buffer, offset + 19, offset + 21);
if (tzHour < 1 || tzHour > 12)
{
return true;
}
}
else
{
return true;
}
}
break;
case 24:
{
//07:39:54.101101101-02:17
if (buffer[offset + 8] != (byte)'.')
{
return true;
}
var nanos = ParseNumberPart(buffer, offset + 9, offset + 18);
if (nanos < 0 || nanos > 999999999)
{
return true;
}
if (!(buffer[offset + 18] == (byte)'+' || buffer[offset + 18] == (byte)'-'))
{
return true;
}
var tzHour = ParseNumberPart(buffer, offset + 19, offset + 21);
if (tzHour < 1 || tzHour > 12)
{
return true;
}
if (buffer[offset + 21] != (byte)':')
{
return true;
}
var tzMinutes = ParseNumberPart(buffer, offset + 22, offset + 24);
if (tzMinutes < 0 || tzMinutes > 59)
{
return true;
}
}
break;
}
}
}
catch (Exception)
{
return true;
}
return false;
}